2.交叉編譯時候如何配置連接庫的搜索路 徑
交叉編譯的時候不能使用本地(i686機器,即PC機器,研發(fā)機器)機器上的庫,但是在做編譯鏈接的時候默認(rèn)的是使用本地庫,即/usr/lib, /lib兩個目錄。因此,在交叉編譯的時候,要采取一些方法使得在編譯鏈接的時候找到需要的庫。首先,要知道:編譯的時候只需要頭文檔,真正實際的庫文檔在鏈接的 時候用到。 (這是我的理解,假如有不對的地方,敬請網(wǎng)上各位大俠指教) 然后,講講如何在交叉編譯鏈接的時候找到需要的庫。(1)交叉編譯時候直接使用-L和-I參數(shù)指定搜索非標(biāo)準(zhǔn)的庫文檔和頭文檔的路徑。例如: arm-linux-gcc test.c -L/usr/local/arm/2.95.3/arm-linux/lib -I/usr/local/arm/2.95.3/arm-linux/include (2)使用ld.so.conf文檔,將用到的庫所在文檔目錄添加到此文檔中,然后使用ldconfig命令刷新緩存。 (3)使用如下命令: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/arm/2.95.3/arm-linux-lib 參見《ld.so.conf 文檔和PKG_CONFIG_PATH變量》這篇文章。 通過環(huán)境變量LD_LIBRARY_PATH指定動態(tài)庫搜索路徑(!)。 通過設(shè)定環(huán)境變量LD_LIBRARY_PATH也可以指定動態(tài)庫搜索路徑。當(dāng)通過該環(huán)境變量指定多個動態(tài)庫搜索路徑時,路徑之間用冒號”:”分隔。 不過LD_LIBRARY_PATH的設(shè)定作用是全局的, 過多的使用可能會影響到其他應(yīng)用程序的運行,所以多用在調(diào)試。(LD_LIBRARY_PATH 的缺陷和使用準(zhǔn)則,可以參考《Why LD_LIBRARY_PATH is bad》 )。通常情況下推薦還是使用gcc的-R或-rpath選項來在編譯時就指定庫的查找路徑,并且該庫的路徑信息保存在可執(zhí)行文件中,運行時它會直接到該路 徑查找?guī)欤苊饬耸褂肔D_LIBRARY_PATH環(huán)境變量查找。 (4)交叉編譯時使用軟件的configure參數(shù)。例如我編譯minigui-1.3.3,使用如下配置:
rm -f config.cache config.status ./configure –build=i686-linux –host=arm-linux –target=arm-linux / CFLAGS=-I/usr/local/arm/2.95.3/arm-linux/include / LDFLAGS=-L/usr/local/arm/2.95.3/arm-linux/lib / –PRefix=/usr/local/arm/2.95.3/arm-linux / –enable-lite / –disable-galqvfb / –disable-qvfbial / –disable-vbfsupport / –disable-ttfsupport / –disable-type1support / –disable-imegb2312py / –enable-extfullgif / –enable-extskin / –disable-videoqvfb / –disable-videoecoslcd 這里我配置了CFLAGS和LDFLAGS參數(shù),這樣一來,我就不用去修改每個Makefile里-L和-I參數(shù)了,也不用再去配置 LD_LIBRARY_PATH或改寫ld.so.conf文檔了。
Linux下動態(tài)庫使用小結(jié)
靜態(tài)庫和動態(tài)庫的基本概念 靜態(tài)庫,是在可執(zhí)行程序連接時就已經(jīng)加入到執(zhí)行碼中,在物理上成為執(zhí)行程序的一部分;使用靜態(tài)庫編譯的程序運行時無需該庫文件支持,哪里都可以用,但是生 成的可執(zhí)行文件較大。動態(tài)庫,是在可執(zhí)行程序啟動時加載到執(zhí)行程序中,可以被多個可執(zhí)行程序共享使用。使用動態(tài)庫編譯生成的程序相對較小,但運行時需要庫 文件支持,如果機器里沒有這些庫文件就不能運行。 2. 如何使用動態(tài)庫 如何程序在連接時使用了共享庫,就必須在運行的時候能夠找到共享庫的位置。linux的可執(zhí)行程序在執(zhí)行的時候默認(rèn)是先搜索/lib和/usr/lib這兩個目錄,然后按照/etc/ld.so.conf里面的配置搜索絕對路徑。同時,Linux也提供了環(huán)境變量LD_LIBRARY_PATH供用戶選擇使用,用戶可以通過設(shè)定它來查找除默認(rèn)路徑之外的 其他路徑,如查找/work/lib路徑,你可以在/etc/rc.d/rc.local或其他系統(tǒng)啟動后即可執(zhí)行到的腳本添加如 下語句:LD_LIBRARY_PATH =/work/lib:(LD_LIBRARY_PATH)。并且LD_LIBRARY_PATH路徑優(yōu)先于系統(tǒng)默認(rèn)路徑之前查找(詳細(xì)參考《使 用 LD_LIBRARY_PATH》)。 不過LD_LIBRARY_PATH的設(shè)定作用是全局的,過多的使用可能會影響到其他應(yīng)用程序的運行,所以多用在調(diào)試。(LD_LIBRARY_PATH 的缺陷和使用準(zhǔn)則,可以參考《Why LD_LIBRARY_PATH is bad》 )。通常情況下推薦還是使用gcc的-R或-rpath選項來在編譯時就指定庫的查找路徑,并且該庫的路徑信息保存在可執(zhí)行文件中,運行時它會直接到該路 徑查找?guī)欤苊饬耸褂肔D_LIBRARY_PATH環(huán)境變量查找。 3.庫的鏈接時路徑和運行時路徑 現(xiàn)代連接器在處理動態(tài)庫時將鏈接時路徑(Link-time path)和運行時路徑(Run-time path)分開,用戶可以通過-L指定連接時庫的路徑,通過-R(或-rpath)指定程序運行時庫的路徑,大大提高了庫應(yīng)用的靈活性。比如我們做嵌入式 移植時#arm-linux-gcc(CFLAGS) –o target –L/work/lib/zlib/ -llibz-1.2.3 (work/lib/zlib下是交叉編譯好的zlib庫),將target編譯好后我們只要把zlib庫拷貝到開發(fā)板的系統(tǒng)默認(rèn)路徑下即可。或者通過- rpath(或-R )、LD_LIBRARY_PATH指定查找路徑。新聞熱點
疑難解答