Linux下指定so動態庫的加載路徑的5種方法!!!


 -Wl,-rpath=linux中真實運行的路徑

重點:編譯時兩個路徑 (一個是編譯用到的庫的路徑,另外一個是linux真實運行環境時用到的路徑)如何編譯?

              不要用絕對路徑,編譯用到的庫的路徑比如是/output/mt_ls2k1000/lib/文件夾下的,則可以按照下面(1)的方式加載進來,而真實環境用到的路徑則采用(2)的方式加載進來,

            這樣編譯時$(CC) -o $(PROGRAM) $(filter %.o ,$+) -L$(OUTPUT_LIB_DIR) $(APP1_LIB) ,一個編譯時用到的路徑和真實運行的路徑都加載進來了。

(1)定義鏈接庫,格式: -L[libpath]

       需要理解:-L 是指此文件夾里面的庫都默認會查詢到。比如有兩個庫 lib1.so  lib2.so存在/output/mt_ls2k1000/lib里面

 則  OUTPUT_LIB_DIR=/output/mt_ls2k1000/lib

編譯時需要  -L$(OUTPUT_LIB_DIR)   就可以找到此文件夾里面的,就可以調用到里面的庫lib1.so  lib2.so。

注意:-L后面是庫的路徑

(2) -lxxx [libxxx.so libxxx.a]

APP1_LIB            := -Wl,--start-group
#應用組件庫
APP1_LIB            += -ldlt69845datatransfor
APP1_LIB            += -lcommonfunc2
APP1_LIB            += -lmtmsg
APP1_LIB            += -lpaho-mqtt3c
APP1_LIB            += -Wl,--end-group
APP1_LIB            += -Wl,-rpath=$(strip /media/dc/mt_tmnl698/lib_zt)

編譯時需要 $(APP1_LIB)  就可以找到里面的libdlt69845datatransfor.so、libcommonfunc2.so等等。

注意:-l后面是具體的庫

(3)注意:-Wl,-rpath=$(strip /media/dc/mt_tmnl698/lib_zt)    

   -Wl,-rpath=linux中真實運行的路徑,這樣自己設定路徑,是最佳的動態庫加載路徑的方式。大於下面1 2 4 5四種搜索路徑的方式.

其中strip的意思:正常情況下編譯出來的共享庫和可執行文件中都帶有符號信息和調試信息,但是發布版本一般不需要這些信息。且這些信息會導致可執行文件大一倍多,所以可以使用strip命令去掉調試信息:strip liba.so

 

一、庫文件的搜索路徑:

1、在配置文件/etc/ld.so.conf中指定動態庫搜索路徑(需要添加其它庫文件的路徑,在文件的最后添加具體的路徑即可 [ 如:/usr/local/lib ],添加后保存退出,然后在命令行ldconfig

假設MySQL數據庫函數庫在 /usr/lib/mysql中,如何讀入高速緩存?

[root@linux ~]# vi /etc/ld.so.conf

include ld.so.conf.d/*.conf

/usr/lib/mysql   <==這一行是新增的。

 

[root@linux ~]# ldconfig

# 畫面上不會顯示任何信息,正常。

 

[root@linux ~]# ldconfig -p

928 libs found in cache `/etc/ld.so.cache'

        libz.so.1 (libc6) => /usr/lib/libz.so.1

        libz.so (libc6) => /usr/lib/libz.so

2、通過環境變量LD_LIBRARY_PATH指定動態庫搜索路徑(當通過該環境變量指定多個動態庫搜索路徑時,路徑之間用冒號":"分隔)

設置臨時增加鏈接動態庫的路徑;使用

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:《your_lib_path》

  比如我的libpaho-mqtt3cs.so.1在/home/mqtt/MQTT-c/lib目錄下,那我使用的是:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/mqtt/MQTT-c/lib

  在博客的另外一篇文章有具體介紹

3、在編譯目標代碼時指定該程序的動態庫搜索路徑(還可以在編譯目標代碼時指定程序的動態庫搜索路徑。 這是通過gcc 的參數"-Wl,-rpath,"指定,當指定多個動態庫搜索路徑時,路徑之間用冒號":"分隔)

      見上

4、默認的動態庫搜索路徑/lib

5、默認的動態庫搜索路徑/usr/lib

    找到缺少的動態庫(由於編譯和鏈接時候的使用到了這個動態庫,所以很容易找得到),將其加到/lib,/usr/lib中的一個文件夾  下,這幾個文件夾是系統默認的搜索路徑。將庫文件放置在其中,運行時就可以搜索到了。

搜索的先后順序是:

1.編譯目標代碼時指定的動態庫搜索路徑;

2.環境變量LD_LIBRARY_PATH指定的動態庫搜索路徑;

3.配置文件/etc/ld.so.conf中指定的動態庫搜索路徑;

4.默認的動態庫搜索路徑/lib;

5.默認的動態庫搜索路徑/usr/lib。

二、Shell可執行程序命令文件搜索路徑:

1.查看所有的搜索路徑:echo $PATH

2.添加新的路徑:

1)只對當前shell窗口有效:

export PATH=$PATH:/new path

2)對所有窗口有效:

修改當前用戶的.bash_profile文件,在PATH=$PATH……后添加":/new path";

保存退出后,需要在當前窗口中執行". .bash_profile",更新配置,之后用echo $PATH顯示更新后的路徑,可以看到新加入的路徑;

注意:在重新登錄前所有新打開的shell窗口要用到新的路徑都需要執行". .bash_profile",更新配置,因為.bash_profile文件的內容在用戶登錄時就讀取了.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM