linux下開發程式,我們經常會呼叫第三方的動態庫,大家可能經常會碰到cannot find l***類似的報錯。
這類報錯一般有三個可能。
第一種,電腦上沒有相應的庫,程式在鏈結的時候自然找不到該動態庫。確認是不是這個問題非常簡單,使用find命令搜尋一下即可。若沒有,安裝對應的so程式即可。
第二種,電腦上有相應的庫,但是庫所在的目錄不在編譯搜尋的目錄內。一般/lib和/usr/lib是編譯時的固定搜尋目錄,而一般/usr/local/lib就不是預設的搜尋目錄。解決這個問題也非常簡單,一:在makefile中增加編譯搜尋目錄,通過-l目錄的方式完成,比如-l/usr/local/lib。二:將so拷貝至系統搜尋目錄,但是系統搜尋目錄一般都是一些系統的庫,不建議將自己的庫拷貝至該目錄,這樣比較亂。三:新增搜尋目錄,在/etc/ld.so.conf.d/目錄下新建乙個檔案比如說opencv.conf,然後在該檔案中加入.so檔案的路徑,比如/usr/local/lib 就可以了。第三種方式和第一種方式的差異在於,第一種改變的是當前編譯程式的搜尋目錄,而第三種改變的是所有在該系統上編譯程式的搜尋目錄。
第三種,電腦上有相應的庫,庫在的目錄也在編譯搜尋的目錄內。一般出現這種情況是電腦上只有lib***.so.xx.xx.xx,而沒有lib***.so。而系統在搜尋的時候一般是搜尋的lib***.so,這樣就會搜尋不到該動態庫。解決的方法也很簡單,新建乙個軟鏈結即可,新建乙個lib***.so指向電腦上存在的lib***.so.xx.xx.xx。
一般通過以上三種方法,基本可以解決找不到動態庫的問題。
附:c/c++編譯執行時動態庫搜尋路徑:
動態鏈結庫 so的編譯與使用
動態庫 so在linux下用c和c 程式設計時經常會碰到,最近在 找了幾篇文章介紹動態庫的編譯和鏈結,總算搞懂了這個之前一直不太了解得東東,這裡做個筆記,也為其它正為動態庫鏈結庫而苦惱的兄弟們提供一點幫助。1 動態庫的編譯 下面通過乙個例子來介紹如何生成乙個動態庫。這裡有乙個標頭檔案 so test...
動態鏈結庫 so的編譯與使用
動態鏈結庫 so的編譯與使用 動態庫 so在 linux 下用c和c 程式設計時經常會碰到,最近在 找了幾篇文章介紹動態庫的編譯和鏈結,總算搞懂了這個之前一直不太了解得東東,這裡做個筆記,也為其它正為動態庫鏈結庫而苦惱的兄弟們提供一點幫助。1 動態庫的編譯 下面通過乙個例子來介紹如何生成乙個動態庫。...
linux下動態庫so檔案的一些認識
from 對.so和.o檔案一直不太清楚,盜用別人的解釋的來了解一下。個人創作,歡迎指錯。牽扯到elf格式,gcc編譯選項待補,簡單實用的說明一下,對linux下的so檔案有個實際性的認識。1.so檔案是什麼?2.怎麼生成以及使用乙個so動態庫檔案?3.位址空間,以及執行緒安全.4.庫的初始化,解析...