linux的excutable在執行的時候缺省是先搜索/lib和/usr/lib這兩個目錄
然後按照ld.so.conf裏面的配置搜索絕對路徑,linux缺省是不會在當前目錄搜索動態庫的
windows加載動態庫的時候,缺省是首先加載本地目錄下的動態庫
然後再搜索windows/system和windows/system32目錄。
1打印動態庫的查找路徑
echo $LD_LIBRARY_PATH
有些機器是echo $LIBRARY_PATH,兩個都可以打出來看看
2設置動態庫的查找路徑(假設我的動態庫放在/usr/local/mydir/lib)
法一:
export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:/usr/local/mydir/lib 這種設置方法退出終端下次回來要重新設置
(如果不行嘗試LIBRARY_PATH = $LIBRARY_PATH:/usr/local/mydir/lib)
法二:
sudo vim ~/.bashrc 或者~/.bash_profile(centos是~/.bash_profile,ubuntu是~/.profile)(當前帳號以後都優先加載你設置目錄的動態庫)
或者系統級別的/etc/profile(讓所有賬號從此都有限加載你設置的目錄的動態庫)
末尾加上:export LD_LIBRARY_PATH=/usr/local/mydir/lib:$LD_LIBRARY_PATH
(如果不行,就嘗試export LIBRARY_PATH=/usr/local/mydir/lib:$LIBRARY_PATH)
修改完不是馬上生效的,需要source ~/.bashrc(注意那個點) 讓剛剛的修改生效,
或者如果你不嫌麻煩 註銷系統重新登錄也是可以的
有時候我們需要加載當前所在目錄路徑的庫那麼
在LD_LIBRARY_PATH=./:/usr/local/mydir/dir:$LD_LIBRARY_PATH
你應該發現了:是個間隔符號
法三(注意此方法的庫路徑需要絕對路徑):
vim /ect/ld.so.conf
如果內容是include ld.so.conf.d/*.conf
那麼建議新建一個配置文件 sudo vim /etc/ld.so.conf.d/myconf.conf,
在myconf.conf裏面加上/usr/local/mydir/lib
否則直接在/ect/ld.so.conf 加上/usr/local/mydir/lib
(當然你非要在/etc/ld.so.conf裏面填寫/usr/local/mydir/lib也是可以的)
保存後執行ldconfig讓你寫的東西生效
3 如果你使用的是linux下的cmake(筆者只用過centos和ubuntu)
如果你有外部已經生成的動態庫文件 libtest.so,在使用CMake編譯生成目標文件myproject時需要依賴該so庫文件,假設文件存於{MY_PROJECT_DIR}/bin目錄下,要鏈接成功, 需要做的是:
在CMakeLists.txt文件中加入兩行
1: LINK_LIBRARIES(${MY_PROJECT_DIR}/bin) #該命令的作用相當與gcc命令的-L參數的作用
2:ADD_EXECUTABLE(myproject ${MY_PROJECT_SOURCES}) # ${MY_PROJECT_SOURCES}爲myproject依賴的源文件目錄
3:TARGET_LINK_LIBRARIES(myproject test)
另外,請確保LINK_LIBRARIES命令寫在ADD_EXECUTABLE之前。
4 當你發現依然不行,心中難免有些煩惱,其實大家都這麼過來的
A 首先檢查你的配置路徑名是否拼寫正確,這個會讓你很無語
B sudo find / -name “mylib.so” 查找是不是有多個同名so導致了這種異常
你甚至可以在嘗試一下sudo find / -name "mylib"
C 如果你沒有這個庫,ldd一下你編譯生成的庫或者運行程序,把你沒有的庫網上找到裝上試試
注意了,即便是有路徑的也要仔細檢查路徑是不是你要的路徑,有時候可能是系統的,不是你提供的庫所在路徑
D 如果你真的有這個庫了,重啓一下試試吧,雖然也許道不明理由但是能幫你解決工程就好
E 如果你是虛擬機的共享文件夾下編譯,有時候會出現問題的,不妨拷貝程序到其他目錄編譯運行試試
F 如果你是編譯成功了,可執行程序起不來,把你程序所需要的庫全部都單獨放到一個目錄,按前面介紹的方法
設置庫路徑,運行一下,sudo ldd xxx(你的程序名)一下程序看看缺什麼庫
G 朋友,你已經努力了,諮詢一下同事看看吧,沒有什麼不好意思的,只是旁觀者清,看別人的錯誤總是比看自己的容易的多
H 祝你好運