libpng交叉編譯
① mingw下的libpng編譯問題,要瘋了,求助
很多朋友都知道如何在linux平台如何編譯比特幣程序,但是,到了windows平台, 就會感覺到無從下手. 其實, 比特幣程序是跨平台的. 你要編譯windows版的比特幣程序,基本上有兩種方法,一種是在linux平台 (推薦ubuntu 13.10)通過交叉編譯的方法來編譯
② makefile的選項CFLAGS,CPPFLAGS,LDFLAGS和LIBS的區別
Linux內核的配置系統由三個部分組成,分別是:Makefile:分布在 Linux 內核源代碼中的 Makefile,定義 Linux 內核的編譯規則; 配置文件(config.in):給用戶提供配置選擇的功能; 配置工具:包括配置命令解釋器(對配置腳本中使用的配置命令進行解釋)和配置用戶界面(提供基於字元界面、基於 Ncurses 圖形界面以及基於 Xwindows 圖形界面的用戶配置界面,各自對應於 Make config、Make menuconfig 和 make xconfig)。這些配置工具都是使用腳本語言,如 Tcl/TK、Perl 編寫的(也包含一些用 C 編寫的代碼)。本文並不是對配置系統本身進行分析,而是介紹如何使用配置系統。所以,除非是配置系統的維護者,一般的內核開發者無須了解它們的原理,只需要知道如何編寫 Makefile 和配置文件就可以。所以,在本文中,我們只對 Makefile 和配置文件進行討論。另外,凡是涉及到與具體 CPU 體系結構相關的內容,我們都以 ARM 為例,這樣不僅可以將討論的問題明確化,而且對內容本身不產生影響。2. Makefile2.1 Makefile 概述Makefile 的作用是根據配置的情況,構造出需要編譯的源文件列表,然後分別編譯,並把目標代碼鏈接到一起,最終形成 Linux 內核二進制文件。由於 Linux 內核源代碼是按照樹形結構組織的,所以 Makefile 也被分布在目錄樹中。Linux 內核中的 Makefile 以及與 Makefile 直接相關的文件有:Makefile:頂層 Makefile,是整個內核配置、編譯的總體控制文件。 .config:內核配置文件,包含由用戶選擇的配置選項,用來存放內核配置後的結果(如 make config)。 arch/*/Makefile:位於各種 CPU 體系目錄下的 Makefile,如 arch/arm/Makefile,是針對特定平台的 Makefile。 各個子目錄下的 Makefile:比如 drivers/Makefile,負責所在子目錄下源代碼的管理。 Rules.make:規則文件,被所有的 Makefile 使用。 用戶通過 make config 配置後,產生了 .config。頂層 Makefile 讀入 .config 中的配置選擇。頂層 Makefile 有兩個主要的任務:產生 vmlinux 文件和內核模塊(mole)。為了達到此目的,頂層 Makefile 遞歸的進入到內核的各個子目錄中,分別調用位於這些子目錄中的 Makefile。至於到底進入哪些子目錄,取決於內核的配置。在頂層 Makefile 中,有一句:include arch/$(ARCH)/Makefile,包含了特定 CPU 體系結構下的 Makefile,這個 Makefile 中包含了平台相關的信息。位於各個子目錄下的 Makefile 同樣也根據 .config 給出的配置信息,構造出當前配置下需要的源文件列表,並在文件的最後有 include $(TOPDIR)/Rules.make。Rules.make 文件起著非常重要的作用,它定義了所有 Makefile 共用的編譯規則。比如,如果需要將本目錄下所有的 c 程序編譯成匯編代碼,需要在 Makefile 中有以下的編譯規則:%.s: %.c$(CC) $(CFLAGS) -S $< -o $@有很多子目錄下都有同樣的要求,就需要在各自的 Makefile 中包含此編譯規則,這會比較麻煩。而 Linux 內核中則把此類的編譯規則統一放置到 Rules.make 中,並在各自的 Makefile 中包含進了 Rules.make(include Rules.make),這樣就避免了在多個 Makefile 中重復同樣的規則。對於上面的例子,在 Rules.make 中對應的規則為:%.s: %.c$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$(*F)) $(CFLAGS_$@) -S $< -o [email protected] Makefile 中的變數頂層 Makefile 定義並向環境中輸出了許多變數,為各個子目錄下的 Makefile 傳遞一些信息。有些變數,比如 SUBDIRS,不僅在頂層 Makefile 中定義並且賦初值,而且在 arch/*/Makefile 還作了擴充。常用的變數有以下幾類:1) 版本信息版本信息有:VERSION,PATCHLEVEL, SUBLEVEL, EXTRAVERSION,KERNELRELEASE。版本信息定義了當前內核的版本,比如 VERSION=2,PATCHLEVEL=4,SUBLEVEL=18,EXATAVERSION=-rmk7,它們共同構成內核的發行版本KERNELRELEASE:2.4.18-rmk72) CPU 體系結構:ARCH在頂層 Makefile 的開頭,用 ARCH 定義目標 CPU 的體系結構,比如 ARCH:=arm 等。許多子目錄的 Makefile 中,要根據 ARCH 的定義選擇編譯源文件的列表。3) 路徑信息:TOPDIR, SUBDIRSTOPDIR 定義了 Linux 內核源代碼所在的根目錄。例如,各個子目錄下的 Makefile 通過 $(TOPDIR)/Rules.make 就可以找到 Rules.make 的位置。SUBDIRS 定義了一個目錄列表,在編譯內核或模塊時,頂層 Makefile 就是根據 SUBDIRS 來決定進入哪些子目錄。SUBDIRS 的值取決於內核的配置,在頂層 Makefile 中 SUBDIRS 賦值為 kernel drivers mm fs net ipc lib;根據內核的配置情況,在 arch/*/Makefile 中擴充了 SUBDIRS 的值,參見4)中的例子。4) 內核組成信息:HEAD, CORE_FILES, NETWORKS, DRIVERS, LIBSLinux 內核文件 vmlinux 是由以下規則產生的:vmlinux: $(CONFIGURATION) init/main.o init/version.o linuxsubdirs$(LD) $(LINKFLAGS) $(HEAD) init/main.o init/version.o --start-group $(CORE_FILES) $(DRIVERS) $(NETWORKS) $(LIBS) --end-group -o vmlinux可以看出,vmlinux 是由 HEAD、main.o、version.o、CORE_FILES、DRIVERS、NETWORKS 和 LIBS 組成的。這些變數(如 HEAD)都是用來定義連接生成 vmlinux 的目標文件和庫文件列表。其中,HEAD在arch/*/Makefile 中定義,用來確定被最先鏈接進 vmlinux 的文件列表。比如,對於 ARM 系列的 CPU,HEAD 定義為: HEAD := arch/arm/kernel/head-$(PROCESSOR).o arch/arm/kernel/init_task.o表明 head-$(PROCESSOR).o 和 init_task.o 需要最先被鏈接到 vmlinux 中。PROCESSOR 為 armv 或 armo,取決於目標 CPU。 CORE_FILES,NETWORK,DRIVERS 和 LIBS 在頂層 Makefile 中定義,並且由 arch/*/Makefile 根據需要進行擴充。 CORE_FILES 對應著內核的核心文件,有 kernel/kernel.o,mm/mm.o,fs/fs.o,ipc/ipc.o,可以看出,這些是組成內核最為重要的文件。同時,arch/arm/Makefile 對 CORE_FILES 進行了擴充:# arch/arm/Makefile# If we have a machine-specific directory, then include it in the build.MACHDIR := arch/arm/mach-$(MACHINE)ifeq ($(MACHDIR),$(wildcard $(MACHDIR)))SUBDIRS += $(MACHDIR)CORE_FILES := $(MACHDIR)/$(MACHINE).o $(CORE_FILES)endifHEAD := arch/arm/kernel/head-$(PROCESSOR).o arch/arm/kernel/init_task.oSUBDIRS += arch/arm/kernel arch/arm/mm arch/arm/lib arch/arm/nwfpeCORE_FILES := arch/arm/kernel/kernel.o arch/arm/mm/mm.o $(CORE_FILES)LIBS := arch/arm/lib/lib.a $(LIBS)5) 編譯信息:CPP, CC, AS, LD, AR,CFLAGS,LINKFLAGS在 Rules.make 中定義的是編譯的通用規則,具體到特定的場合,需要明確給出編譯環境,編譯環境就是在以上的變數中定義的。針對交叉編譯的要求,定義了 CROSS_COMPILE。比如:CROSS_COMPILE = arm-linux-CC = $(CROSS_COMPILE)gccLD = $(CROSS_COMPILE)ld......CROSS_COMPILE 定義了交叉編譯器前綴 arm-linux-,表明所有的交叉編譯工具都是以 arm-linux- 開頭的,所以在各個交叉編譯器工具之前,都加入了 $(CROSS_COMPILE),以組成一個完整的交叉編譯工具文件名,比如 arm-linux-gcc。CFLAGS 定義了傳遞給 C 編譯器的參數。LINKFLAGS 是鏈接生成 vmlinux 時,由鏈接器使用的參數。LINKFLAGS 在 arm/*/Makefile 中定義,比如:# arch/arm/MakefileLINKFLAGS :=-p -X -T arch/arm/vmlinux.lds6) 配置變數CONFIG_*.config 文件中有許多的配置變數等式,用來說明用戶配置的結果。例如 CONFIG_MODULES=y 表明用戶選擇了 Linux 內核的模塊功能。.config 被頂層 Makefile 包含後,就形成許多的配置變數,每個配置變數具有確定的值:y 表示本編譯選項對應的內核代碼被靜態編譯進 Linux 內核;m 表示本編譯選項對應的內核代碼被編譯成模塊;n 表示不選擇此編譯選項;如果根本就沒有選擇,那麼配置變數的值為空。2.3 Rules.make 變數前面講過,Rules.make 是編譯規則文件,所有的 Makefile 中都會包括 Rules.make。Rules.make 文件定義了許多變數,最為重要是那些編譯、鏈接列表變數。O_OBJS,L_OBJS,OX_OBJS,LX_OBJS:本目錄下需要編譯進 Linux 內核 vmlinux 的目標文件列表,其中 OX_OBJS 和 LX_OBJS 中的 "X" 表明目標文件使用了 EXPORT_SYMBOL 輸出符號。M_OBJS,MX_OBJS:本目錄下需要被編譯成可裝載模塊的目標文件列表。同樣,MX_OBJS 中的 "X" 表明目標文件使用了 EXPORT_SYMBOL 輸出符號。O_TARGET,L_TARGET:每個子目錄下都有一個 O_TARGET 或 L_TARGET,Rules.make 首先從源代碼編譯生成 O_OBJS 和 OX_OBJS 中所有的目標文件,然後使用 $(LD) -r 把它們鏈接成一個 O_TARGET 或 L_TARGET。O_TARGET 以 .o 結尾,而 L_TARGET 以 .a 結尾。
③ 在ubantu12.04版本環境下,使用交叉編譯工具編譯opencv,老出現這個問題,求大神指教!
整個項目的結構圖:
編寫DetectFaceDemo.java,代碼如下:
[java] view
plainprint?
package com.njupt.zhb.test;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
import org.opencv.objdetect.CascadeClassifier;
//
// Detects faces in an image, draws boxes around them, and writes the results
// to "faceDetection.png".
//
public class DetectFaceDemo {
public void run() {
System.out.println("\nRunning DetectFaceDemo");
System.out.println(getClass().getResource("lbpcascade_frontalface.xml").getPath());
// Create a face detector from the cascade file in the resources
// directory.
//CascadeClassifier faceDetector = new CascadeClassifier(getClass().getResource("lbpcascade_frontalface.xml").getPath());
//Mat image = Highgui.imread(getClass().getResource("lena.png").getPath());
//注意:源程序的路徑會多列印一個『/』,因此總是出現如下錯誤
/*
* Detected 0 faces Writing faceDetection.png libpng warning: Image
* width is zero in IHDR libpng warning: Image height is zero in IHDR
* libpng error: Invalid IHDR data
*/
//因此,我們將第一個字元去掉
String xmlfilePath=getClass().getResource("lbpcascade_frontalface.xml").getPath().substring(1);
CascadeClassifier faceDetector = new CascadeClassifier(xmlfilePath);
Mat image = Highgui.imread(getClass().getResource("we.jpg").getPath().substring(1));
// Detect faces in the image.
// MatOfRect is a special container class for Rect.
MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(image, faceDetections);
System.out.println(String.format("Detected %s faces", faceDetections.toArray().length));
// Draw a bounding box around each face.
for (Rect rect : faceDetections.toArray()) {
Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0));
}
// Save the visualized detection.
String filename = "faceDetection.png";
System.out.println(String.format("Writing %s", filename));
Highgui.imwrite(filename, image);
}
}
package com.njupt.zhb.test;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
import org.opencv.objdetect.CascadeClassifier;
//
// Detects faces in an image, draws boxes around them, and writes the results
// to "faceDetection.png".
//
public class DetectFaceDemo {
public void run() {
System.out.println("\nRunning DetectFaceDemo");
System.out.println(getClass().getResource("lbpcascade_frontalface.xml").getPath());
// Create a face detector from the cascade file in the resources
// directory.
//CascadeClassifier faceDetector = new CascadeClassifier(getClass().getResource("lbpcascade_frontalface.xml").getPath());
//Mat image = Highgui.imread(getClass().getResource("lena.png").getPath());
//注意:源程序的路徑會多列印一個『/』,因此總是出現如下錯誤
/*
* Detected 0 faces Writing faceDetection.png libpng warning: Image
* width is zero in IHDR libpng warning: Image height is zero in IHDR
* libpng error: Invalid IHDR data
*/
//因此,我們將第一個字元去掉
String xmlfilePath=getClass().getResource("lbpcascade_frontalface.xml").getPath().substring(1);
CascadeClassifier faceDetector = new CascadeClassifier(xmlfilePath);
Mat image = Highgui.imread(getClass().getResource("we.jpg").getPath().substring(1));
// Detect faces in the image.
// MatOfRect is a special container class for Rect.
MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(image, faceDetections);
System.out.println(String.format("Detected %s faces", faceDetections.toArray().length));
// Draw a bounding box around each face.
for (Rect rect : faceDetections.toArray()) {
Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0));
}
// Save the visualized detection.
String filename = "faceDetection.png";
System.out.println(String.format("Writing %s", filename));
Highgui.imwrite(filename, image);
}
}
3.編寫測試類:
[java] view
plainprint?
package com.njupt.zhb.test;
public class TestMain {
public static void main(String[] args) {
System.out.println("Hello, OpenCV");
// Load the native library.
System.loadLibrary("opencv_java246");
new DetectFaceDemo().run();
}
}
//運行結果:
//Hello, OpenCV
//
//Running DetectFaceDemo
///E:/eclipse_Jee/workspace/JavaOpenCV246/bin/com/njupt/zhb/test/lbpcascade_frontalface.xml
//Detected 8 faces
//Writing faceDetection.png
package com.njupt.zhb.test;
public class TestMain {
public static void main(String[] args) {
System.out.println("Hello, OpenCV");
// Load the native library.
System.loadLibrary("opencv_java246");
new DetectFaceDemo().run();
}
}
//運行結果:
//Hello, OpenCV
//
//Running DetectFaceDemo
///E:/eclipse_Jee/workspace/JavaOpenCV246/bin/com/njupt/zhb/test/lbpcascade_frontalface.xml
//Detected 8 faces
//Writing faceDetection.png
④ 在ARM上運行交叉編譯後的opencv文件,沒有輸出
一、交叉編譯opencv
構造:
下載:各個庫的下載可以直接搜名字到官網下載
幾個關鍵解釋:
「--prefix=」 後邊跟make install時的位置,本例中,libz在make install時將安裝到/usr/arm-linux-gnueabihf中
「--host=」 後邊跟arm-linux表明使用的是ARM環境
有configure的才能進行configure配置
4)所有的makefile修改類似
Libz的交叉編譯
第一步:# ./configure --prefix=/usr/arm-linux-gnueabihf --shared
第二步:修改makefile,主要有下邊幾個,修改的時候通篇參照即可
CC=arm-linux-gnueabihf-gcc
AR=arm-linux-gnueabihf-ar rc
RANLIB=arm-linux-gnueabihf-ranlib
STRIP = arm-linux-gnueabihf-strip
如果有ARCH的話,ARCH=ARM
第三步:#sudo make
#sudo make install
Libjpeg的交叉編譯
第一步:#./configure --host=arm-linux --prefix=/usr/arm-linux-gnueabihf --enable-shared --enable-static CC=arm-linux-gnueabihf-gcc
第二步:參考1)中方法修改makefile
第三步:#sudo make
#sudo make install
Libpng的交叉編譯
第一步:#./configure --host=arm-linux --prefix=/usr/arm-linux-gnueabihf --enable-shared --enable-static CC=arm-linux-gnueabihf-gcc
第二步:參考1)中方法修改makefile
第三步:#sudo make
#sudo make install
Yasm的交叉編譯
第一步:#./configure --host=arm-linux --prefix=/usr/arm-linux-gnueabihf --enable-shared --enable-static
第二步:修改makefile
第三步:#sudo make
#sudo make install
Libx264的交叉編譯
第一步:#CC=arm-linux-gnueabihf-gcc ./configure --enable-shared --host=arm-linux --disable-asm --prefix=/usr/arm-linux-gnueabihf
第二步:修改config.mak里的參數,因為makefile要調用config.mak,所以修改方法同makefile
第三步:#sudo make
#sudo make install
Libxvid的交叉編譯
第一步:首先切換目錄 #cd build/generic
第二步:#./configure --prefix=/usr/arm-linux-gnueabihf --host=arm-linux --disable-assembly
第三步:#sudo make
#sudo make install
ffmpeg的交叉編譯
第一步:
./configure --enable-cross-compile --target-os=linux --cc=arm-linux-gnueabihf-gcc --arch=arm --enable-shared --disable-static --enable-gpl --enable-nonfree --enable-ffmpeg --disable-ffplay --enable-ffserver --enable-swscale --enable-pthreads --disable-yasm --disable-stripping --enable-libx264 --enable-libxvid --extra-cflags=-I/usr/arm-linux-gnueabihf/include --extra-ldflags=-L/usr/arm-linux-gnueabihf/lib --prefix=/usr/arm-linux-gnueabihf
第二步:修改makefile文件
第三步:#sudo make
#sudo make install
第四步:將ffmpeg加入pkg-config
執行#sudo gedit /etc/bash.bashrc,在末尾加入
export LD_LIBRARY_PATH=/usr/arm-linux-gnueabihf/lib/
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/arm-linux-gnueabihf /lib/pkgconfig
export PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR:/usr/arm-linux-gnueabihf /lib/
完畢後使用命令:#source /etc/bash.bashrc
或者單獨使用三個export,不過壽命只在一個終端中,終端關閉時就失效。
幾個關鍵解釋:--extra-flags指向xvid的安裝路徑,--extra-ldflags指向x264的路徑
安裝cmake-gui
執行:#sudo apt-get install cmake-qt-gui
Opencv的交叉編譯
第一步:修改opencv/platflrms/linux/目錄下的arm-gnueabi.toolchain.cmake,將其所有刪掉,寫入:
set( CMAKE_SYSTEM_NAME Linux )
set( CMAKE_SYSTEM_PROCESSOR arm )
set( CMAKE_C_COMPILER arm-linux-gnueabihf-gcc )
set( CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++ )
第二步:在opencv目錄下新建build目錄,進入build目錄,執行命令:
#cmake -DCMAKE_TOOLCHAIN_FILE=../platforms/linux/arm-gnueabi.toolchain.cmake ../
這時,要保證出現:
第三步:使用cmake-gui打開CMakeCache.txt,去掉所有的無關項,修改CMAKE_INSTALL_PREFIX,來確定make install的目錄
第四步:#sudo make
#sudo make install
可能出現的錯誤:
opencv編譯不通過,出現skip之類的,說明ffmpeg沒編譯好,或者其編譯好了,但是pkg-config沒有設置好,一定要設置好其環境
前邊幾步不通過的話,看看命令有沒有少,或者有沒有修改好makefile
在arm上使用時,一種方法時直接將編譯好的opencv目錄下的lib文件拷貝到開發板對應的/lib目錄下,其他或者拷貝到自己指定的目錄,並設置好環境變數即可使用
⑤ 我在arm-linux平台上移植了opencv2.0.0,與libjpeg庫libpng庫,在板子上使用以下程序打開一個JPG圖片後
你在交叉編譯時是如何配置的?
./configure --host=arm-none-linux-gnueabi --without-gtk
--without-carbon --without-quicktime --without-1394libs
--without-ffmpeg --without-python --without-swig --enable-static
--disable-shared --disable-apps CXX=arm-none-linux-gnueabi-g++
CPPFLAGS=-I/usr/arm-2008q3/arm-none-linux-gnueabi/include
--prefix=/usr/opencv
其中:--without-gtk 不使用gtk庫,加上了嗎?
⑥ 交叉編譯libnpg庫 ./configure CC=mipsisa32-elf-gcc --host=mipsisa32-linux 求大神給予幫助
編譯安裝。關鍵要看configure後,屏幕上出現的那一堆內容的最末尾有沒有error:
沒有就可以進行下一步。至於其他的,例如warning,可以忽略。
make和make install也是一樣
⑦ 交叉編譯opencv 自動生成zlib嗎
第一步,安裝交叉編譯工具arm-linux-gcc-4.3.2
xgy@ubuntu:~/toolchain$mkdir arm
xgy@ubuntu:~/toolchain$cd arm
xgy@ubuntu:~/toolchain/arm$tar xvf arm-linux-gcc-4.3.2
解壓後,在當目錄下會多一個usr目錄,由於我不喜歡這目錄太深,然後就執行如下命令:
xgy@ubuntu:~/toolchain/arm$cp -rv usr/local/* .
xgy@ubuntu:~/toolchain/arm$rm -rf usr
接下來設置環境變數PATH,執行命令如下:
xgy@ubuntu:~/toolchain/arm$cd
xgy@ubuntu:~$vi .bashrc
在.bashrc文件的最後加入:exportPATH=$PATH:/home/xgy/toolchain/arm/4.3.2/bin 保存退出(:wq)
xgy@ubuntu:~$source .bashrc //使剛設置的值生效
到此本來交叉編譯工具就已經安裝成功了的,可經過檢查卻發現下圖中左列的arm-linux-g++,arm-linux-gcc是4.3.3版本的(用命令arm-linux-gcc -v 查看),而其它的確是版本的,4.3.2這是一個奇怪現象!
因為我曾試過用4.3.3版本的g++交叉編譯opencv2.0總是出錯如下:
在這里,我只好創建軟鏈接,使它指向右側的arm-none-linux-gnueabi-g++,arm-none-linux-gnueabi-gcc。在創建之前先對原來的兩個文件做備份。執行命令如下:
在這里再次檢查下arm-linux-gcc及arm-linux-g++的版本
命令arm-linux-gcc –v 輸出的最後一行是應該是:gcc version 4.3.2 (Sourcery G++ Lite 2008q3-72)在這里說明下,這個很重要:現在所用的arm-linux-gcc實際上使用的是~./toolchain/arm/4.3.2/bin/目錄下的arm-none-linux-gnueabi-gcc,而它的include為arm/4.3.2/arm-none-linux-gnueabi/include,對應的lib為arm/4.3.2/arm-none-linux-gnueabi/lib,也就是說,你如果用arm-linux-gcc編譯程譯的話,對頭文件它預設的就找arm/4.3.2/arm-none-linux-gnueabi/include,對庫它預設的就找 arm/4.3.2/arm-none-linux-gnueabi/lib,而不是/usr/include /usr/lib,所以如果你要加什麼.h .a .so文件的話,記著一定要把這些文件加到這兩個目錄下去,不然這個交叉編譯器會告你找不到所要的庫或頭文件。這里的原理對於其它交叉編譯器也適應(主要指目錄結構),只是可能目錄名不一樣。
OK,到此,交編譯器安裝成功!
2012-11-2 今天換了一個4.3.2版本的arm-linux-gcc沒有發現上面的問題,也許是我以前在復制的時候出錯了,用cp命令時最好使用-a選項。
由於opencv2.0依懶於zlib,png、jpeg圖形庫而我們的arm-linux-gcc 是不帶這些庫的,它只帶了一些基本的庫,所以這里我們首先就要交叉編譯這些文件,安裝到arm/4.3.2/arm-none-linux-gnueabi/include,arm/4.3.2/arm-none-linux-gnueabi/lib目錄中。庫不一定要最新的,庫的版本太新了,opencv有可能不認識。
首先安裝zlib庫,這個是後面兩個庫的編譯基礎。
xgy@ubuntu:~/tmp$ tar zxvf zlib-1.2.3.tar.gz
在當前目錄下會多一個zlib-1.2.3的目錄。
由於 zlib 庫的configure 腳本不支持交叉編譯選項,只好自己手動臨時把 gcc 修改成指向我們的交叉編譯器 arm-linux-gcc 。執行如下命令:
xgy@ubuntu:~/tmp$ cd /usr/bin
xgy@ubuntu:/usr/bin$ sudo –i //這里得切換到root用戶下才能有許可權做下面的操作。
[sudo] password for xgy: //在這里輸入xgy用戶的密碼
root@ubuntu:~# cd /usr/bin
root@ubuntu:/usr/bin# mv gcc gcc_back
root@ubuntu:/usr/bin# mv ld ld_back
root@ubuntu:/usr/bin# ln -sv/home/xgy/toolchain/arm/4.3.2/bin/arm-linux-gcc ./gcc
root@ubuntu:/usr/bin# ln -sv/home/xgy/toolchain/arm/4.3.2/bin/arm-linux-ld ./ld
下面檢查下是否換過來了
root@ubuntu:/usr/bin#gcc –v
gcc version4.3.2 (Sourcery G++ Lite 2008q3-72) //為輸出的最後一行
root@ubuntu:/usr/bin#ld -v
GNU ld (SourceryG++ Lite 2008q3-72) 2.18.50.20080215
接著切換到原來的目錄~/tmp/zlib-1.2.3執行如下命令
root@ubuntu:/usr/bin#su – xgy //注意這里和用命令 suxgy是有區別的,-表示用xgy的環境
xgy@ubuntu:~$ cdtmp/zlib-1.2.3/
xgy@ubuntu:~/tmp/zlib-1.2.3$./configure --prefix=/home/xgy/toolchain/arm/4.3.2/arm-none-linux-gnueabi/--shared
xgy@ubuntu:~/tmp/zlib-1.2.3$make (如果以前在這個目錄下執行過make ,那要先執行makeclean 然後執行make)
xgy@ubuntu:~/tmp/zlib-1.2.3$make install
然後可以去~/toolchain/arm/4.3.2/arm-none-linux-gnueabi/{include,lib}目錄下是否多了一些文件(可以另外再開一個終端查看,這樣方便點),如下圖:
在這里記著把剛才改過的gcc再改回去,不然後面會出錯!!!
接下來安裝png庫,這個是用來顯示png圖形的。
xgy@ubuntu:~/tmp$tar jxvf libpng-1.2.18.tar.bz2
xgy@ubuntu:~/tmp$cd libpng-1.2.18/
由於libpng不提供有效的configure腳本(可以查看INSTALL文件),所以只好自己動手改Makefile文件了。
xgy@ubuntu:~/tmp/libpng-1.2.18$cp scripts/makefile.linux Makefile
xgy@ubuntu:~/tmp/libpng-1.2.18$vi Makefile
CC=arm-linux-gcc //修改這里
MKDIR_P=mkdir -p
# where "make install" putslibpng12.a, libpng12.so*,
# libpng12/png.h and libpng12/pngconf.h
# Prefix must be a full pathname.
prefix=/home/xgy/toolchain/arm/4.3.2/arm-none-linux-gnueabi
exec_prefix=$(prefix)
# Where the zlib library and include filesare located.
#ZLIBLIB=/usr/local/lib
#ZLIBINC=/usr/local/include
ZLIBLIB=/home/xgy/toolchain/arm/4.3.2/arm/arm-none-linux-gnueabi/lib //修改這里
ZLIBINC=/home/xgy/toolchain/arm/4.3.2/arm/arm-none-linux-gnueabi/include//修改這里
保存退出後執行如下命令:
xgy@ubuntu:~/tmp/libpng-1.2.18$ make
xgy@ubuntu:~/tmp/libpng-1.2.18$ makeinstall
然後可以去~/toolchain/arm/4.3.2/arm-none-linux-gnueabi/{include,lib}目錄下是否多了一些文件(可以另外再開一個終端查看,這樣方便點),如下圖:
如果有錯,檢查下前面的步聚,特別是看zlib有安裝有沒有出錯。
接下來安裝jpeg庫
xgy@ubuntu:~/tmp/libpng-1.2.18$ cd ..
xgy@ubuntu:~/tmp$tar zxvf jpegsrc.v6b.tar.gz
xgy@ubuntu:~/tmp/jpeg-6b$
xgy@ubuntu:~/tmp/jpeg-6b$ ./configure --prefix=/home/xgy/toolchain/arm/4.3.2/arm-none-linux-gnueabi/--host=arm-linux --enable-shared
按此命令進行,然後修 改makefile文件將CC的值改為arm-linux-gcc,一定得改!!
xgy@ubuntu:~/tmp/jpeg-6b$make
安裝前需要在 arm-linux 下建個目錄,不然安裝會出錯
xgy@ubuntu:~/tmp/jpeg-6b$mkdir -pv /home/xgy/toolchain/arm/4.3.2/arm-none-linux-gnueabi/man/man1
mkdir: created directory `/home/xgy/toolchain/arm/4.3.2/arm-none-linux-gnueabi/man/man1
xgy@ubuntu:~/tmp/jpeg-6b$ make install
然後可以去~/toolchain/arm/4.3.2/arm-none-linux-gnueabi/{include, lib}目錄下是否多了一些文件(可以另外再開一個終端查看,這樣方便點),如下圖:
到此,三個庫安裝完畢!
⑧ OpenCV交叉編譯時用到的幾個依賴庫
OpenCV交叉編譯時用到的幾個依賴庫。在BB Black 入門基礎之OpenCV的交叉編譯 一文中用到。大家有需要的可以拿去用。
↑收起
文件列表
.deps
----|ControlResource.Po
----|DCU99Editor.Po
----|DuplexEditor.Po
.eclipseme.tmp
----|emulation
----|----|PhoneBook.jad
----|----|PhoneBook.jar
verified
----|classes
----|----|com
----|----|----|north
----|----|----|----|phonebook
----|----|----|----|----|model
----|----|----|----|----|----|Account.class
----|----|----|----|----|----|ApplicationException.class
----|----|----|----|----|----|Index.class
----|----|----|----|----|----|Model$AccountFilter.class
----|----|----|----|----|----|Model$IndexFilter.class
----|----|----|----|----|----|Model.class
----|----|----|----|----|----|Preference.class
----|----|----|----|----|----|UserModel.class
ui
----|ConfirmationDialog.class
----|DetailInfoUI.class
----|Dialog.class
----|DialogListener.class
----|IndexFunctionUI$ListIndex.class
----|IndexFunctionUI.class
----|ListMerchantGroupUI.class
----|ListPhoneUI.class
----|LoginUI.class
----|MerchantGroupDetailInfoUI.class
----|NewPhoneUI.class
----|SearchPhoneUI.class
----|Title.class
----|UIController$1.class
----|UIController$EventID.class
----|UIController.class
----|WaitCanvas$1.class
----|WaitCanvas.class
----|WelcomeUI.class
PhoneBookMIDlet.class
.myeclipse
----|CVS
----|----|Repository
----|----|Root
.settings
----|CVS
----|----|Entries
----|----|Repository
----|----|Root
org.eclipse.core.resources.prefs
.svn
----|prop-base
props
text-base
----|readme.txt.svn-base
tmp
----|prop-base
props
text-base
all-wcprops
dir-prop-base
entries
format
.tmp_versions
----|dw4002.mod
dependence
----|ffmpeg-0.10.3.tar.bz2
----|jpegsrc.v8d.tar.gz
----|libpng-1.5.14.tar.gz
----|libv4l-0.6.1.gz
----|tiff-4.0.3.tar.gz
----|x264-snapshot-20120528-2245-stable.tar.bz2
----|xvidcore-1.3.2.tar.gz
----|zlib127.zip
..dir.dat
._CotEditor_346
._PortVaR
.classpath
.cproject
.cxl
.depend
.dw4002.ko.cmd
.dw4002.mod.o.cmd
.dw4002.o.cmd
.exe
.gitignore
.htaccess
.message
.pdf
.project
.qmake.internal.cache
.screenrc
.synopsys_dc.setup
.synopsys_pt.setup
.untf
.vimrc
.xhdl3.xref
⑨ Qt 軟體中怎麼自動加入build版本號
當進入解壓好的源碼包後,使用./configure –help命令,可以獲得相應幫助,那我們只要選取參數部分看看 -release 這個參數顯而易見,就是編譯Qt以發布版的模式進行,一般來說,最後系統完成後,庫就應該是發布版。 -release 與上面對應,自然是調試版了,如果開發的話,可以選擇它吧。 -debug-and-release 囧,上面那兩個的兒子。 -developer-build 囧,我錯了,開發者也可以用這個的,選了這個後,可以進行自動測試,不過還沒去用過,以後可以研究研究。 -opensource -commercial 這兩個參數是指是編譯是商業版本的,還是開源版本呢,視個人情況而定。 -shared -static 這兩個參數是指Qt的lib以動態還是靜態編譯生成,這自然也是視個人需要的。 -no-fast -fast 這兩個就很有關系,如果對自己的電腦性能很有信心,那就選第一個,那所有的工程文件都會生成到makefiles中,那編譯的時間,估計可以看完變形金剛了。如果選第二個,那就加入子目錄和庫到makefiles,這樣就能加快編譯的速度。 -no-largefile -largefile 顧名思義,支不支持大文件,一般來說,嵌入式里是不會有從超過4G的大文件的,那就選第一個吧。 -no-exceptions -exceptions 計算機英語夠好的人都該懂,這個自然就是異常情況,選則編譯器支持拋出異常,否則不支持。 -no-accessibility -accessibility 可訪問性的支持,說實話,這個我真不知道有什麼有用了。等哪天發現了,再來好好解釋。 -no-stl -stl 是都加入stl的支持,stl,這應該算是C++程序員應該都了解了,再不濟,那也總聽說過大名吧。 no-sql-<driver> -qt-sql-<driver> -plugin-sql-<driver> 這 個可要好好說明下,一般來說,對於一個優秀的項目開發,資料庫是必不可少的,qt也自帶了大多數資料庫驅動,可以完美地支持資料庫的使用。對於數 據庫的使用,我們可以直接qt驅動編譯進去,或者以插件的形式編譯進去。一般來說,最簡單地就是直接編譯進去,但使用插件形式的可以更加靈活,針對不同的 需求將驅動插件添加。其中,<>代表的是驅動名,如果我想直接添加sqlite的支持話,形式如下:-qt-sql-sqlite。其他名稱 可以自己查看參數里,有詳細地介紹。 -system-sqlite sqlite真受歡迎啊,當然那麼優秀的嵌入式資料庫,本人也是基本使用它來進行開發。這個參數意思是使用操作系統上的sqlite資料庫,如果是不太會移植的,可以考慮直接使用qt自帶的驅動。 -no-qt3support -qt3support 這個也是簡潔易懂,加不加對qt3的支持。 no-xmlpatterns -xmlpatterns 選擇對xml的支持,如果對網路無需求的話,就不用加了。 -no-phonon -phonon phonon是qt中處理多媒體的模塊,比如放放視頻什麼來著,不過本人從沒用過,也是根據需要選擇的。 -no-phonon-backend -phonon-backend 與上面類似,只不過這兩是以插件的形式加入支持。 -no-svg -svg 是否加入svg的支持,svg即可縮放矢量圖形。 -no-webkit -webkit 是否加入webkit的支持,這可是個好東西,不過如果跟網路不搭界的話,還是不支持吧。 -no-scripttools -scripttools 是否加入腳本工具的支持,這對php等腳本工程師來說是個很棒的參數,但對於我這樣菜鳥,就別提了。 -platform target 目標平台,這可是關鍵了,如果不注意的話,編譯出來是x86上的話,哪怕是再牛的嵌入式工程師來也沒法幫你移植到開發板上。通常,本人是linux-arm-g++。 -no-mmx -no-3dnow -no-sse -no-sse2 這四個參數是針對CPU的指令集,老實說,我也不甚了解,不過,對於開發並不是影響很大。 -qtnamespace 把qt的庫封裝到命名空間,沒啥重要用處,依個人愛好加吧。 -qtlibinfix 將所有的qt的.so庫重命名,也沒啥大用處。 -no-sql-<driver> -qt-sql-<driver> -plugin-sql-<driver> -system-sqlite 這是相當明顯的,如果這都看不出來,,囧,那您一定比我近視(本人800度近視。。) 就 是說如果是-no-XX-,就說明編譯時不選擇這個參數,如過是-qt-XX-,說明我們可以編譯直接選用qt自帶的驅動,如果是 -plugin-XX-,就是將驅動以插件形式編譯,而-system-XXX,當然是使用操作系統提供的驅動,不過那就需要您自己移植了,而且有時還要 用第三方的API,就方便來說非常麻煩,但是不排除您是牛人要好好玩玩的情況。 接下來,我們接著研究配置參數。 -qt-zlib -system-zlib 想 必經過上面的講解,參數的意思已經很快得知,就是選擇qt帶的zlib庫還是系統的zlib。zlib庫是用於文件和資料壓縮的庫,對於新入嵌入式的人來 說,可能並無太大的用處,但是在以後的實際開發中,特別是對於多媒體圖像圖形的工程師來說,就肯定用到,因為圖形圖像的壓縮都要使用或涉及到這個庫。 -no-gif -qt-gif 這是選擇gif的支持,如果選擇qt支持的話,那在用qt開發的項目中,就能顯示gif圖,gif也是比較普遍的圖片格式了,英文全稱是Graphics Interchange Format。 -no-libtiff -qt-libtiff -system-libtiff tiff是一種非常復雜的光柵圖像格式,並且有直接現成的C語言實現庫,因此選擇參數時就有了qt和system,一般來說,科學相關的開發里可能會用到。 -no-libpng -qt-libpng -system-libpng png的相關參數,一種非失真性壓縮點陣圖圖形文件格式,其實就是為了替代gif搞出來的,也是隨實際需要來選擇,當然,也有C語言實現的庫。 -no-libmng -qt-libmng -system-libmng 大汗,大汗,這可是超級罕見的東西,QT竟然也能支持,說實話,這個參數我看來就是無視的。MNG是多幀PNG動畫格式,結構極其復雜,基本沒人用。 -no-libjpeg -qt-libjpeg -system-libjpeg jpeg,這么有名的圖片格式也不用說了,隨需要選擇吧。 -no-openssl -openssl -openssl-linked SSL,Security Socket Layer,是一個安全傳輸協議,在Internet網上進行數據保護和身份確認,而OpenSSL是一個開放源代碼的實現了SSL及相關加密技術的軟體 包,在qt中,我們可以選擇直接支持,或者OpenSSL鏈接支持,這個參數也是為有需要者提供的。 以上是第三方庫的參數選擇,緊接著就是qt附加參數,在附加參數里,我們可以指定編譯的部分及加入參數來獲取信息。 -make -nomake 一 句話,說明,就說我可以這兩個參數選擇哪些我要編譯,哪些我不需要,在 libs tools examples demos docs translations這些里你可以選擇,比如examples,並不重要,可以放在-nomake後,這樣編譯過程中就不會編譯這部分了。通過適當的 選擇,我們可以大大加快編譯的速度,這對配置較差的機子來說有著積極意義。 -R <string> -l <string> 這兩個參數是為編譯時增加一個庫的運行路徑及頭文件的路徑,比如使用tslib作為開發觸摸驅動時,我們就應使用這兩個參數來指定tslib的庫路徑和頭文件路徑。 -no-rpath -rpath 這個參數比較難於理解,簡單地說,就是告訴動態載入器,到-rpath指定的目錄中尋找編譯時須要的動態鏈接庫,語法就與上面的參數結合,比如 -rpath -R/home/xxxx。 -continue 這個參數的作用就是當出現錯誤時依然進行配置編譯,換我是不會加上的。 -verbose, -v 這個參數就很眼熟,在前面的文章中有過詳細介紹,簡言之,就是顯示配置的每一步的具體信息。 -no-optimized-qmake -optimized-qmake 是否編譯生成優化過的qmake,沒啥大用,也屬於可有可無的參數。 -no-nis -nis 是否編譯NIS支持,NIS(網路信息服務)是一個提供目錄服務的RPC(遠程過程調用)應用服務,當然沒網路需要的可以再次華麗地無視。 -no-cups -cups 是 否編譯CUPS支持,是不是想問什麼用啊?~~~~囧,開列印店用的。好了,不說冷笑話,CUPS給Unix/Linux用戶提供了一種可靠有效 的方法來管理列印。它支持IPP,並提供了LPD,SMB(服務消息塊,如配置為微軟WINDOWS的列印機)、JetDirect等介面。CUPS還可 以瀏覽網路列印機。它的開發提供者是大名鼎鼎的「水果生產商」----蘋果公司。 -no-iconv -iconv 選擇是否編譯iconv支持,iconv是一個計算機程序以及一套應用程序編程介面的名稱。它的作用是在多種國際編碼格式之間進行文本內碼的轉換。這對跨語言Qt開發人員來說是很有用的,當然,考慮到中文的編碼,我也選擇加入支持。 -no-pch -pch 是 否支持預編譯過的頭文件。預編譯頭就是把一個工程中的一部分代碼,預先編譯好放在一個文件里(通常以.pch為擴展名),這個文件就稱為預編譯頭 文件。這些預先編譯好的代碼在工程開發的過程中不會被經常改變。如果這些代碼被修改,則需要重新編譯生成預編譯頭文件。媽媽經常說:不懂就要學。我說:不 懂就加上。。。 no-dbus -dbus -dbus-linked 是否編譯編譯QtDBus模塊。dbus是freedesktop下開源的Linux IPC通信機制,本身Linux 的IPC通信機制包括,管道(fifo),共享內存,信號量,消息隊列,Socket等。在Qt中DBUS是有單獨的模塊的,可見其重要性。 -rece-relocations 對於額外的庫鏈接器優化,可以減少編譯中的再定位。 no-separate-debug-info -separate-debug-info 是否存儲debug信息在.debug,一般為了查錯,還是選擇存儲吧。 -xplatform target 相當淺顯的參數,即交叉編譯的目標平台,一般來說根據你所要移植的目標板來確定。 -no-feature-<feature> -feature-<feature> 選 取qte的feature編譯,對於這個,我理解為特性,特性的描述你可以參考src/corelib/global/qfeatures.txt,在這 裡面對於每個特性都有比較充分的講解。對於特性地選擇,也是要根據開發需求進行,如果裁剪適當,能大大為qte庫瘦身。 -embedded <arch> 嵌入式平台架構選擇,可以選擇arm,mips,x86及generic,視你的目標平台決定吧。 -armfpa -no-armfpa 這個參數也只是針對ARM平台的,是否加入對於基於ARM的浮點數格式的支持,通常,這個參數在編譯時會自動選擇。 -little-endian -big-endian 目標平台的大端和小端選擇,這應該是常識了,如果這不知道,就不要來混嵌入式了 -host-little-endian -host-big-endia 主機平台的大端和小端選擇,屬於雞肋的參數,不選擇也會在配置時自動選擇。 -no-freetype -qt-freetype -system-freetype 選擇freetype,FreeType庫是一個完全免費(開源)的、高質量的且可移植的字體引擎,它提供統一的介面來訪問多種字體格式文件,在嵌入式開發中,有套可使用的字體對於中文開發至關重要,本人一般使用文泉驛字體。 -qconfig local 使用本地的qconfig配置文件來替代全部參數配置,有需要的可以去研究下,可以裁剪控制項級別的參數。 -depths <list> 顯示的像素位深,也是根據需要來進行吧。 -qt-decoration-<style> -plugin-decoration-<style> -no-decoration-<style> 這個是選擇qt的樣式風格,對於需要美化界面的項目來說,可以好好選擇下。 -no-opengl -opengl <api> 是否加入opengl的支持,OpenGL是個專業的3D程序介面,是一個功能強大,調用方便的底層3D圖形庫。不過對於一般的開發來說,似乎有很少用到的地方。 -qt-gfx-<driver> -plugin-gfx-<driver> -no-gfx-<driver> 這個是相當重要的一個參數,選擇QtGui的圖形顯示驅動,比如我們在pc上使用qvfb模擬時,就應該加入對qfvb的支持。我們可以在 linuxfb,transformed,qvfb,vnc,multiscreen這幾個中選擇。在平常的開發板上,選擇linuxfb即可。 -qt-kbd-<driver> -plugin-kbd-<driver> -no-kbd-<driver> 選擇鍵盤的驅動支持,可以支持usb鍵盤,串口鍵盤等等,也是在tty,usb ,sl5000, yopy, vr41xx ,qvfb中選擇。 qt-mouse-<driver> -plugin-mouse-<driver> -no-mouse-<driver> 滑鼠的驅動支持,一般都會選擇tslib,可以完美地支持觸摸屏,在pc,bus,linuxtp,yopy,vr41xx,tslib,qvfb中選擇吧。 -iwmmxt 加入iWMMXt指令的編譯,也只是部分XScale架構才具有。 -no-glib -glib 是否加入glib庫的支持,glib庫對應即gtk庫,就也是說加入後可以使用gtk。
⑩ 編譯玩qt交叉編譯環境,進行qt程序開發時make總是報錯
缺少了些文件
可以看到第一句:
/usr/local/arm/2.95.3/arm-linux/bin/ld: cannot find -lqte
應該在交叉編譯器上,你可以用別人做好的arm-linux-gcc編譯鏈。我也弄了好久,前幾天弄好了