交叉編譯庫依賴問題的解決方法

wuruixn發表於2020-04-07

./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。具體步驟如下:

  1. 移植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
    
  2. 編譯安裝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"

相關文章