歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux下面系統開發Makefile須知(動態鏈接庫的深入理解)

Linux下面系統開發Makefile須知(動態鏈接庫的深入理解)

日期:2017/2/28 14:55:07   编辑:Linux教程

Linux下面共享庫默認路徑是/usr/lib. /usr/local/lib. /lib

一般的ELF格式的可執行文件可以通過readelf --d xxx。來獲得共享庫和程序運行時的庫的路徑和信息

1、把我寫好的動態庫放到系統目錄裡。缺點:1a、系統目錄被搞的很混亂。1b、在別人電腦上部署會很麻煩。

2、指定LD_LIBRARY_PATH環境變量。缺點:不能直接啟動應用程序而需要外部shell啟動。

3 、今天,我了解到,gcc在鏈接的時候有個rpath選項。它可以把動態庫的路徑直接寫到elf文件中去。這樣可以將rpath寫成相對路徑。方便部署。

程序在連接時使用了共享庫,就必須在運行的時候能夠找到共享庫的位置。Linux的可執行程序在執行的時候默認是先搜索/lib和/usr /lib這兩個目錄,然後按照/etc/ld.so.conf裡面的配置搜索絕對路徑。同時,Linux也提供了環境變量LD_LIBRARY_PATH 供用戶選擇使用,用戶可以通過設定它來查找除默認路徑之外的其他路徑,如查找/work/lib路徑,你可以在/etc/rc.d/rc.local或其 他系統啟動後即可執行到的腳本添加如下語句:LD_LIBRARY_PATH =/work/lib:$(LD_LIBRARY_PATH)。並且LD_LIBRARY_PATH路徑優先於系統默認路徑之前查找(詳細參考《使用 LD_LIBRARY_PATH》)。

不過LD_LIBRARY_PATH的設定作用是全局的,過多的使用可能會影響到其他應用程序的運行,所以多用在調 試。(LD_LIBRARY_PATH的缺陷和使用准則,可以參考《Why LD_LIBRARY_PATH is bad》 )。通常情況下推薦還是使用gcc的-R或-rpath選項來在編譯時就指定庫的查找路徑,並且該庫的路徑信息保存在可執行文件中,運行時它會直接到該路 徑查找庫,避免了使用LD_LIBRARY_PATH環境變量查找。

運行時的庫可以通過rpath或者-R來指定,編譯連接時可用-L/lib/... 和la來指定

現代連接器在處理動態庫時將鏈接時路徑(Link-time path)和運行時路徑(Run-time path)分開,用戶可以通過-L指定連接時庫的路徑,通過-R(或-rpath)指定程序運行時庫的路徑,大大提高了庫應用的靈活性。比如我們做嵌入式 移植時#arm-Linux-gcc $(CFLAGS) –o target –L/work/lib/zlib/ -llibz-1.2.3 (work/lib/zlib下是交叉編譯好的zlib庫),將target編譯好後我們只要把zlib庫拷貝到開發板的系統默認路徑下即可。或者通過- rpath(或-R )

Copyright © Linux教程網 All Rights Reserved