動態庫的載入與測試

2021-06-25 08:31:24 字數 1267 閱讀 7833

之前寫了個程式,使用了第三方庫lzma(裝了xz命令(make install))。程式寫好以後,編譯沒有問題,但是執行時卻報了如下的錯誤:

./searcher: error while loading sharedlibraries: liblzma.so.5: cannot open shared object file: no such file or directory

我重新察看了一下當時安裝xz的log,發現liblzma.so.5其實已經在如下目錄裡面了

ll /usr/local/lib/liblzma.so.5.0.5

-rwxr-xr-x 1 root root 562091 aug 13 16:37/usr/local/lib/liblzma.so.5.0.5

但為什麼程式執行時找不到呢?

在網上查詢了一下答案,可能的原因是雖然庫檔案已經放在系統動態庫路徑下面了,但是系統並不能自動識別它,需要手動告訴系統它的存在(除非重起伺服器)。只需要簡單的一條命令ldconfig,系統就會自己去重新生成乙份動態庫檔案了。

另外,其實我們在啟動程式之前,也可以考察一下其動態庫是否都能找到,使用ldd命令即可:

ldd ./searcher

libdl.so.2 => /lib64/libdl.so.2 (0x000000323e800000)

libpthread.so.0 => /lib64/libpthread.so.0 (0x000000323ec00000)

liblzma.so.5 => not found

libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003251e00000)

libm.so.6 => /lib64/libm.so.6 (0x000000323e400000)

libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x000000324fa00000)

libc.so.6 => /lib64/libc.so.6 (0x000000323e000000)

/lib64/ld-linux-x86-64.so.2 (0x000000323dc00000)

順道再提一下編譯的情況。如果需要使用某個第三方動態庫檔案,在編譯選項中需要這麼寫:-llzma。其中-l表示需要使用某庫檔案(動態庫或者靜態庫)。lzma只是庫名的簡稱,系統會自動在前面加上lib,在後面加上.so。再舉乙個例子,如果使用libm.so.6,只需要這麼寫:-lm。對於需要靜態載入的庫檔案(通常以.a結尾,而非.so),需要使用編譯選項的-l來標明靜態庫檔案的路徑。

動態鏈結庫dll的 靜態載入 與 動態載入

dll 兩種鏈結方式 動態鏈結和靜態鏈結 鏈結亦稱載入 動態鏈結是指在生成可執行檔案時不將所有程式用到的函式鏈結到乙個檔案,因為有許多函式在作業系統帶的dll檔案中,當程式執行時直接從作業系統中找。而 靜態鏈結就是把所有用到的函式全部鏈結到exe檔案中。動態鏈結是只建立乙個引用的介面,而真正的 和資...

動態載入動態庫

message函式的宣告你應該知道吧,把它的宣告和下面的語句寫到乙個標頭檔案中 pragma comment lib,a.lib 然後你的對話方塊.cpp中包含這個標頭檔案就可以使用message函式了。如果dll沒有對應的.lib檔案,那麼就只能使用動態載入的方式了。動態呼叫動態庫步驟 1 建立乙...

動態載入庫

使用vc程式設計時遇到乙個奇怪的情況,包含了,但是編譯器編譯結果告知無法找到hmonitor結構,從vc上 能看到hmonitor結構宣告在windef.h裡,但是包含了還是不行,最後乙個同事告知包含multimon.h即可。好,切入正題。結構找到了,不過很多函式沒有找到,在網上也沒找到好方法。最後...