前言:
在linux下編譯程序運行時,因為涉及到動態庫加載搜索問題,老是會出現加載失敗的現象出現,現在整理一下相關知識,供下次遇到問題查看。
linux下程序尋找動態庫路徑:
- 1.編譯生成時,指定的搜索路徑。
在makefile中,一般使用”-Wl -rpath”來指明程序運行時到哪個路徑去找庫。當指定多個動態庫搜索路徑時,路徑之間用冒號隔開,不能有空格。
- 2.環境變量LD_LIBRARY_PATH中指定的路徑。
可以使用 echo LD_LIBRARY_PATH查看。一般初始時/lib和/user/lib庫包含在里面。用戶可以往里面添加。
- 3./etc/ld.so.cache中緩存的路徑。
/etc/ld.so.conf的第一行有一個引用命令:include ld.so.conf.d/*.conf, 所以可以通過修改/etc/ls.so.conf這個配置文件來增刪路徑,也可以增加一個.conf文件來配置特有的動態庫路徑。直接將尋庫路徑加進來即可,保存后需要運行一下ldconfig重載一下。
- 4.默認的/lib/和/usr/lib。
這兩個路徑是系統最初就添加在LD_LIBRARY_PATH中,所以將庫移動到這里亦可以尋找到。
動態庫相關命令:
- 1.ld 查看gcc鏈接程序。
- 2.ldd查看可執行程序中所依賴的庫的程序,后面直接接可執行程序名即可查看該程序需要鏈接的庫已經庫路徑,如果沒找到的庫會找不到的提示。
- 3.ldconfig是用來更新/etc/ld.so.conf的修改生效。
- 4.nm是用來查看.so庫的函數名,標記是T的就是動態庫里面生成的名字.
Linux下動態庫搜索路徑順序問題
以下按優先級排序:
- 1.編譯目標代碼時指定的動態庫搜索路徑;
- 2.環境變量LD_LIBRARY_PATH指定的動態庫搜索路徑;
- 3.配置文件/etc/ld.so.conf中指定的動態庫搜索路徑;
- 4.默認動態庫搜索路徑/lib;
- 5.默認動態庫搜索路徑/usr/lib;
動態庫增添方法:
1.在LD_LIBRARY_PATH中增加路徑。
export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/XXX
這種方式時臨時有效,一旦登出就失效了。
2.修改~./bashrc或~/.bash_profile或系統級別的/etc/profile
export PATH=/wangqinghe/lib:$LD_LIBRARY_PATH
source .bashrc (source命令通常用於重新執行剛修改的初始化文件,使之立刻生效,而不必注銷並重新登錄)。
3.在/etc/ld.so.conf中增加路徑,或者在/etc/文件目錄下增加 *.conf文件去配置自己獨有的尋庫路徑。修改之后要ldconfig一下。
補充:
ldconfig 命令的用途,主要是在默認搜尋目錄(/lib和/usr/lib)以及動態庫配置文件/etc/ld.so.conf內所列的目錄下,搜索出可共享的動態鏈接庫(格式如前介紹,lib*.so*),進而創建出動態裝入程序(ld.so)所需的連接和緩存文件.緩存文件默認為/etc/ld.so.cache,此文件保存已排好序的動態鏈接庫名字列表.)
說明:
程序運行時不會把當前目錄作為默認的尋庫路徑,除非你在編譯時指定了。
個人覺得在makefile時指定尋庫路徑比較好一些,因為它在程序員的控制之中,如果出了問題可以一一排除。