終於今天在下班前把bluez的 dependent都安裝好了 原因出在於....我自己白爛= =
因為我沒瞭解到configure設置的重要性 導致一堆lib連結出錯....一直以為是toolchain的問題..
好在hychen(之前名字打錯...被他靠北了一下) 最後出手救了我
當他說:「好好檢查你安裝lib的位置」,我才知道,我套件幾乎都安裝路徑都錯了
原因出在於 configure設置,所以今天要來好好瞭解configure 及 make設置。
其實cross compile並不難,好好檢查一下config.log的訊息,很容易找出原因
最不好找的就是路徑及連結lib,因為這種就是google也很難救的了你
你必須要知道自己設置了哪些environment、compile哪些檔、會安裝到哪裡等等
這些都知道,如果是少檔或是要改source code,看一下及google一下很簡單就解決了(當然也不是絕對,只是依我目前遇到的狀況...)
cross compile(交叉編譯)的意思是指,在host(本機)用目標(target)的toolchain(工具鍵)把所有的source code都compile,並且安裝到target的root file system裡面。
所以,在configure設置時,最常見到就是:
#CC=arm-linux-gcc ./configure --prefix=/usr --host=arm-linux
CC是configure用於指定C編譯器的變量,linux source code(包括kernel source)幾乎都是用C撰寫,所以大多數隻要指定CC就好。
prefix是預設安裝目錄。因為現在的package幾乎都是用autoconf,會自動生成Makefile,所以configure設置變的很重要,會影響到Makefile,也就影響到你編譯出來的程式是不是正確的,假設今天我的工作目錄是在/home/dickyjob,當我把 --prefix=/usr,這時它不會安裝到/home/dickyjob/usr底下喔,它會跑到/usr,所以我通常(在TI文件學的)在make完之後,要安裝時都會加:
make install DESTDIR=/home/dickyjob
加上prefix的設置,它是才如我遇期的裝到/home/dickyjob/usr底下。(當然也有人直接把prefix的路徑設好,這樣就可以直接打make install,但我覺得我這種方法比較直覺...見人見智囉^_^)
host、build、target這都是指軟件運行的系統平台,只是略有不同:
--host:是你編譯好之後要運行的平台
--build:是你目前正在使用的機台(也就是local)
--target:是你編譯的程序可以處理的平台,這個比較好不理解,實際上我用到的機會也不多,但稍微翻了一下文件,所以我先說自己理解的部份:
大部份我們都是編譯程序,而不是工具,也就是說,arm-linux-gcc就是工具,我們一般用到的機會不多,因為廠商都會準備好,不太可能還讓你自己編譯工具(除非他不想賣了.....找死?),幾乎都是把「工具」拿來編譯我們要的程序.....
OK,如果還不太瞭解,大家都知道如果要打造一個toolchain,跑不掉下面這些套件:
binutils : toolchain的二進制檔
gcc : toolchain的gcc工具
glibc : toolchain的C lib庫
glibc add on : toolcahin的額外lib庫
在製作工具時,--target就很重要了,如果想自己做一個toolchain或想更瞭解交叉編譯,可以到這
ARM cross-compile HOW TO
./configure的設置有很多,但大部份都很直覺,只是最主要的設置不要出錯就好,喔,還有,當要重新configure時,最好把config.cache先殺掉,因為先前的設置會儲存在裡面,安全一點先殺點會比較好。
更多configure設置
下面是我自行寫的script,想配置configure輕鬆一點...
#!/bin/sh
#環境
export PATH=/home/arm/2007q1/bin:$PATH
export PREFIX=/home/dickyjob
export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig
export HOST=arm-linux
export BUILD=i686-linux
CROSS_COMPILE=arm-linux
export CC=$CROSS_COMPILE-gcc
export CXX=$CROSS_COMPILE-g++
export AR=$CROSS_COMPILE-ar
export RANLIB=$CROSS_COMPILE-ranlib
export NM=$CROSS_COMPILE-nm
export AS=$CROSS_COMPILE-as
export LD=$CROSS_COMPILE-ld
export STRIP=$CROSS_COMPILE-strip
export READELF=$CROSS_COMPILE-readelf
export STRINGS=$CROSS_COMPILE-strings
export SIZE=$CROSS_COMPILE-size
export ADDR2LINE=$CROSS_COMPILE-addr2line
No comments:
Post a Comment