7/27/2009

BT porting (2) - cross complie

終於今天在下班前把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