交叉編譯庫依賴問題的解決方法
./configure --build=mipsel-linux --host=mipsel-linux
--target=mipsel-linux' will build native mipsel-linux binutils on
mipsel-linux.
具體解釋一下,build就是你正在使用的機器,host就是你編譯好的程式可以執行的平臺,target就是你編譯的程式可以處理的平臺.這個build和host比較好理解,但是target就不好辦了,到底什麼意思呢?一般來說,我們平時所說的交差編譯用不到他target的,比如./configure
--build=i386-linux,--host=arm-linux就可以了,在386的平臺上編譯可以執行在arm板的程式.但是,一般我們都是編譯程式,而不是編譯工具,如果我們編譯工具,比如gcc,這個target就有用了.如果我們需要在一個我們的機器上為arm開發板編譯一個可以處理mips程式的gcc,那麼target就是mips了.不知道我的解釋是否正確,如果大家看到了這篇帖子,覺得不對,批評指正.
http://jianbo.de/b/archives/503
在交叉編譯移植程式的時候,我們常常會遇到這樣的情況:要編譯的程式依賴於某個動態/靜態連結庫。而這個庫也需要我們編譯移植。在編譯沒有別的依賴的連結庫的時候很簡單,設定好交叉工具鏈、目標架構就可以了。而在編譯有依賴需求的程式的時候,我們常常遇到找不到標頭檔案、找不到庫檔案的問題。很是煩人。
要解決這個問題,其實還是很容易的。只需要先編譯安裝好執行庫,然後在編譯有依賴需求的程式的時候,在編譯引數裡把目標板上的庫路徑、標頭檔案路徑分別通過-L、-I選項新增到工具鏈中即可。這樣一來既不會影響目標板、編譯宿主系統的正常執行,也不用每次手動把檔案複製到工具鏈中造成汙染(而且升級的時候也分不出來)。
用程式碼來說話:
export CFLAGS="-L/path/to/target/libs -I/path/to/target/headers" ./configure [some options] make && make install
舉例來說,假設我的目標系統是mini2440開發板(CPU是基於armv4t核心的S3C2440),工具鏈是CodeSourcery提供的GNU ARM/LINUX工具鏈。目標板的根檔案系統位於/mini2440/root,要編譯的程式是lighttpd,依賴於pcre。具體步驟如下:
-
移植pcre
cd /tmp # 新建pcre、pcre-install目錄,分別用於編譯和安裝pcre mkdir pcre{,-install} # 下載解壓 wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.00.tar.bz2 tar xvf pcre-8.00.tar.bz2 -C ./pcre cd pcre/ # 配置(啟用unicode支援、設定host執行時系統為arm-none-linux-gnueabi,使configure猜出交叉編譯工具鏈字首) ./configure --host=arm-none-linux-gnueabi --prefix=/ --enable-utf8 --enable-unicode-properties # 編譯安裝到臨時目錄/tmp/pcre-install # 由於是用於嵌入式,所以像文件這類東西就不要了。我們之需要將動態連結庫和標頭檔案留下 make && make DESTDIR=/tmp/pcre-install install cp -rv ../pcre-install/lib/pcre.so* /mini2440/root/lib cp -rv ../pcre-install/include/pcre.so* /mini2440/root/include
-
編譯安裝lighttpd
cd /tmp # 新建lighttpd、lighttpd-install目錄,分別用於編譯和安裝 mkdir lighttpd{,-install} # 下載解壓 wget http://download.lighttpd.net/lighttpd/releases-1.4.x/lighttpd-1.4.25.tar.bz2 tar xvf lighttpd-1.4.25.tar.bz2 -C ./lighttpd cd lighttpd/ # 配置(啟用unicode支援、設定host執行時系統為arm-none-linux-gnueabi,使configure猜出交叉編譯工具鏈字首) CFLAGS="-march=armv4t -I/mini2440/root/include -L/mini2440/root/lib" ./configure --prefix=/ --host=arm-none-linux-gnueabi --disable-FEATURE --disable-ipv6 --disable-lfs --without-zlib --without-bzip2 # 編譯安裝到臨時目錄/tmp/pcre-install # 由於是用於嵌入式,所以像文件這類東西就不要了。我們之需要將動態連結庫和可執行檔案留下 make && make DESTDIR=/tmp/lighttpd-install install cp -rv ../lighttpd-install/lib/* /mini2440/root/lib cp -rv ../lighttpd-install/sbin/* /mini2440/root/sbin
這樣就可以了
看上面的例子,最關鍵的地方,就是配置lighttpd的時候,在配置專案前的CFLAGS變數的設定。其實我們完全可以把他單獨設定成環境變數,這樣就不用每次編譯東西都需要輸入了。
export CFLAGS="-march=armv4t -I/mini2440/root/include -L/mini2440/root/lib"
相關文章
- 關於Gradle編譯時下載依賴失敗解決方法Gradle編譯
- 解決 requests-2.17.3 依賴 chardet 庫版本不匹配的問題
- Git Worktree:解決分支依賴衝突的問題Git
- Go etcd 的依賴問題終於解決了。。。Go
- 解決Maven中90%的依賴(導包)問題Maven
- Rustyinject是Rust的編譯時依賴注入DI庫Rust編譯依賴注入
- 依賴衝突時的解決方法
- Leptonica在VS2010中的編譯一,編譯它依賴於庫編譯
- .Net Core利用反射動態載入類庫的方法(解決類庫不包含Nuget依賴包的問題)反射
- 依賴管理利器---Spring IO Platform解決Spring組合依賴問題實戰SpringPlatform
- 解決Android studio中gradle依賴下載太慢的問題AndroidGradle
- 問題解決:嘗試解決maven依賴找不到的n種姿勢Maven
- Spring 迴圈依賴的三種方式(三級快取解決Set迴圈依賴問題)Spring快取
- maven依賴衝突以及解決方法Maven
- 介面測試時依賴前置資料的問題解決了...
- 解決npm 安裝部分依賴失敗問題總結NPM
- maven打包jar無法打入依賴專案問題解決MavenJAR
- 函式計算|如何使用層解決依賴包問題?函式
- 交叉編譯編譯
- composer依賴相關的問題和解決辦法
- 【Android 安全】DEX 加密 ( 代理 Application 開發 | 加密解密演算法 API | 編譯代理 Application 依賴庫 | 解壓依賴庫 aar 檔案 )Android加密APP解密演算法API編譯
- 解決 requests 庫 URL 編碼問題
- 問題解決--npm install 安裝依賴一直失敗NPM
- [譯]使用Go Cloud的Wire進行編譯時依賴注入GoCloud編譯依賴注入
- lazarus交叉編譯編譯
- golang交叉編譯Golang編譯
- GDB交叉編譯編譯
- 編譯rocketmq-console並解決RejectedExecutionException問題編譯MQException
- springBoot依賴下載問題Spring Boot
- Ubuntu處理依賴問題Ubuntu
- [譯] Rust如何解決依賴地獄Rust
- 如何解決微服務之間的資料依賴問題?微服務
- spring解決迴圈依賴Spring
- go語言go get 匯入官方依賴的解決方法Go
- matlab編譯exe問題具體解決辦法Matlab編譯
- 編譯器的自展和自舉、交叉編譯編譯
- 面試題:Spring 的迴圈依賴問題面試題Spring
- 解決eclipse的maven依賴報錯EclipseMaven