linux系統上有兩類可執行程式,一類是靜態鏈結的可執行程式,其包含執行所需的所有函式,所以執行不依賴任何外部庫;
一類是動態鏈結的可執行程式。
動態庫設定問題
通過原始碼安裝程式時,主要有三步策略:configure,make,make install。在configure階段,為了檢測安裝安裝環境是否滿足,通常情況下都是通過pkg-config來檢測其依賴的動態庫是否存在,這一過程pkg-config會去尋找相應庫的pc檔案。當我們完某個程式後,如果其提供了動態庫,在原始碼中會有乙個或者多個pc檔案,當執行make install時,這些pc檔案會被拷貝到$/lib/pkgconfig目錄下。這個prefix是configure階段通過配置引數-prefix指定的(預設為/usr/local)。除了通過prefix也可以通過設定環境變數pkg_config_path來指定pc檔案所在路徑。
pkg_config_path
其字面含義的是「軟體包的配置路徑」,主要用於編譯階段查詢依賴的動態庫
ld_library_path
其字面含義是裝載器的庫路徑,ld是loader的簡寫,在linux系統啟動乙個程式的過程就叫做裝載,乙個程式要執行時或多或少的會依賴一些動態庫(靜態編譯的除外)。
可通過執行「ldd 可執行程式名」檢視乙個軟體啟動時所依賴的動態庫。/etc/ld.so.conf中配置的路徑是在程式執行期間,尋找動態庫的路徑。
問題:1,catkin_make執行過程出現:
make[2]: *** 沒有規則可製作目標「/usr/lib/x86_64-linux-gnu/libopencv_imgproc.so.3.2.0」
理解:在make生成可執行檔案的時候,會去尋找其依賴的的動態庫,系統由於安裝了多個opencv,在/usr/lib/x86_64-linux-gnu/pkg-config目錄下,opencv的pc檔案是老版本的
解決:在新版opencv編譯時的目錄下尋找pc檔案,替換舊版的pc檔案
linux 動態庫路徑查詢
linux 執行的時候,是如何管理共享庫 so 的?在 linux 下面,共享庫的尋找和載入是由 lib ld.so實現的。ld.so 在標準路經 lib,usr lib 中尋找應用程式用到的共享庫。但是,如果需要用到的共享庫在非標準路經,ld.so 怎麼找到它呢?目前,linux 通用的做法是將非...
linux 靜態庫動態庫封裝問題
在linux下類庫主要有靜態庫和動態庫兩種庫,首先呢,就說說這兩種庫的差異 靜態庫 在程式連線的時候會自動的連線到程式裡,所以一但編譯完成,靜態庫也就不需要了。靜態庫通常以.a結尾。例如 libutil.a libuuid.a libz.a等。動態庫 在程式編譯時並不會被連線到目標 中,而是在程式執...
Linux動態庫的查詢路徑
前兩天寫了乙個動態庫,然後試圖編譯到程式裡面去執行,結果發現編譯的時候通過gcc的 l引數來指定路徑僅僅能讓編譯通過,執行時還是會出問題的。比如下面這個例子 main.c是主程式,sum.c中間含有乙個函式add,用來執行加法,如下 1 2 main.c3 4 include 5 6int add ...