以下例項的環境是amd64 + ubuntu10.10 +g++ 4.4.5測試成功,在其他配置的機器上可能有一點區別。
動態庫的使用方式中有兩種,第一種是類似於靜態庫的使用,另一種我稱之為真正的動態載入動態庫,主要是因為這種方式在程式執行的過程中載入鏈結庫,使用之後在解除安裝鏈結庫。
先介紹第一種。
在目錄/home/owner/test/下建立我們的實驗程式:
//dll_fun.c
#include
void dll_function(const char*szstring)
編譯生成動態鏈結庫
gcc -c-fpic
dll_fun.c //這裡一定要加上-fpic選項,不然下一步編譯失敗
gcc -shared -fpic -olibdllfun.so
dll_fun.o //生成動態鏈結庫libdllfun.so
建立呼叫動態庫方法:
void
dll_function(const char*szstring);
int main()
編譯main.c生成可執行檔案
gcc -o main main.c -l. -ldllfun//這裡提供了剛才生成的dllfun庫
如果此時執行./main的話,會出現如下錯誤:
cannot open shared object file:no such file or directory
這是因為系統未找到動態庫libdllfun.so。
linux動態鏈結庫的預設搜尋路徑是/lib和/usr/lib,因此動態庫被建立後,一般都複製到這兩個目錄下面,當程式執行時需要某動態庫,並且改動態庫還沒有載入到記憶體中,則系統會自動到這兩個預設的搜尋路徑中去查詢相應的動態庫檔案,然後載入改檔案到記憶體中,這樣程式就可以使用該動態庫中的函式以及該動態庫中的其他資源了。在linux中,動態庫的搜尋路徑除了預設的搜尋路徑外,還可以通過其他三種方法來指定,這裡只介紹其中的一種:通過環境變數ld_library_path指定動態庫搜尋路徑。
當通過該環境變數指定多個動態鏈結庫搜尋路徑時,路徑之間用冒號":"分隔。
使用下面命令來配置環境
mkdir
/home/owner/test/lib//將這個目錄設定為動態庫的存放目錄
mkdir/home/owner/test/libdllfun.so
/home/owner/test/lib/libdllfun.so
export
ld_library_path=/home/owner/test/lib
此時設定這個環境變數之後的所有命令命令中,該環境變數都有效。
把.so(動態鏈結庫)直接放在根目錄下的lib檔案下(!!!一面總是載入不到路徑)
ubuntu下動態鏈結庫的編譯和使用
環境 uabntu 14.04 1.設定從當前目錄下載入動態庫so檔案 ld library path linux的excutable在執行的時候預設是先搜尋 lib和 usr lib這兩個目錄,然後按照ld.so.conf裡面的配置搜尋絕對路徑,linux預設是不會在當前目錄搜尋動態庫的。1 臨時...
ubuntu下動態鏈結庫的編譯和使用例項
以下例項的環境是amd64 ubuntu10.10 g 4.4.5測試成功,在其他配置的機器上可能有一點區別。動態庫的使用方式中有兩種,第一種是類似於靜態庫的使用,另一種我稱之為真正的動態載入動態庫,主要是因為這種方式在程式執行的過程中載入鏈結庫,使用之後在解除安裝鏈結庫。先介紹第一種。在目錄 ho...
ubuntu下動態鏈結庫的編譯和使用例項
以下例項的環境是amd64 ubuntu10.10 g 4.4.5測試成功,在其他配置的機器上可能有一點區別。動態庫的使用方式中有兩種,第一種是類似於靜態庫的使用,另一種我稱之為真正的動態載入動態庫,主要是因為這種方式在程式執行的過程中載入鏈結庫,使用之後在解除安裝鏈結庫。先介紹第一種。在目錄 ho...