三種方法 Linux動態庫 so 搜尋路徑

2021-05-25 07:40:33 字數 2498 閱讀 3347

方法一:在配置檔案/etc/ld.so.conf中指定動態庫搜尋路徑。

可以通過編輯配置檔案/etc/ld.so.conf來指定動態庫的搜尋路徑,該檔案中每行為乙個動態庫搜尋路徑。每次編輯完該檔案後,都必須執行命令ldconfig使修改後的配置生效。我們通過例1來說明該方法。

例1:我們通過以下命令用源程式pos_conf.c(見程式1)來建立動態庫 libpos.so,詳細建立過程請參考文[1]。

# gcc -c pos_conf.c

# gcc -shared -fpci -o libpos.so pos_conf.o

#include

void pos()

printf("/root/test/conf/lib/n");

程式1: pos_conf.c

接著通過以下命令編譯main.c(見程式2)生成目標程式pos。

# gcc -o pos main.c -l. -lpos

void pos();

int main()

pos();

return 0;

程式2: main.c

然後把庫檔案移動到目錄/root/test/conf/lib中。

# mkdir -p /root/test/conf/lib

# mv libpos.so /root/test/conf/lib

最後編輯配置檔案/etc/ld.so.conf,在該檔案中追加一行"/root/test/conf/lib"。

執行程式pos試試。

# ./pos

./pos: error while loading shared libraries: libpos.so: cannot open shared object file: no such file or directory

出錯了,系統未找到動態庫libpos.so。找找原因,原來在編輯完配置檔案/etc/ld.so.conf後,沒有執行命令ldconfig,所以剛才的修改還未生效。我們執行ldconfig後再試試。

# ldconfig

# ./pos

/root/test/conf/lib

程式pos執行成功,並且列印出正確結果。

方法二:通過環境變數ld_library_path指定動態庫搜尋路徑。

通過設定環境變數ld_library_path也可以指定動態庫搜尋路徑。當通過該環境變數指定多個動態庫搜尋路徑時,路徑之間用冒號":"分隔。下面通過例2來說明本方法。

例2:我們通過以下命令用源程式pos_env.c(見程式3)來建立動態庫libpos.so。

# gcc -c pos_env.c

# gcc -shared -fpci -o libpos.so pos_env.o

#include

void pos()

printf("/root/test/env/lib/n");

程式3: pos_env.c

測試用的可執行檔案pos可以使用例1中的得到的目標程式pos,不需要再次編譯。因為pos_conf.c中的函式pos和pos_env.c中的函式pos 函式原型一致,且動態庫名相同,這就好比修改動態庫pos後重新建立該庫一樣。這也是使用動態庫的優點之一。

然後把動態庫libpos.so移動到目錄/root/test/conf/lib中。

# mkdir -p /root/test/env/lib

# mv libpos.so /root/test/env/lib

我們可以使用export來設定該環境變數,在設定該環境變數後所有的命令中,該環境變數都有效。

例如:# export ld_library_path=/root/test/env/lib

# ld_library_path=/root/test/env/lib ./pos

/root/test/env/lib

程式pos執行成功,並且列印的結果是"/root/test/env/lib",正是程式pos_env.c中的函式pos的執行結果。因此程式pos搜尋到的動態庫是/root/test/env/lib/libpos.so。

方法三:在編譯目標**時指定該程式的動態庫搜尋路徑。

還可以在編譯目標**時指定程式的動態庫搜尋路徑。這是通過gcc 的引數"-wl,-rpath,"指定(如例3所示)。當指定多個動態庫搜尋路徑時,路徑之間用冒號":"分隔。

例3:我們通過以下命令用源程式pos.c(見程式4)來建立動態庫libpos.so。

# gcc -c pos.c

# gcc -shared -fpci -o libpos.so pos.o

#include

void pos()

printf(".//n");

程式4: pos.c

因為我們需要在編譯目標**時指定可執行檔案的動態庫搜尋路徑,所以需要用gcc命令重新編譯源程式main.c(見程式2)來生成可執行檔案pos。

# gcc -o pos main.c -l. -lpos -wl,-rpath,./

再執行程式pos試試。

# ./pos

Linux中載入動態鏈結庫的三種方法

第一種是修改系統檔案 在 etc ld.so.conf檔案中指定了預設的動態鏈結庫查詢路徑,我的 etc ld.so.conf檔案內容是這樣的include etc ld.so.conf.d conf 也就是說它間接的指定了定義路徑的檔案,我們只需要把需要的路徑加到 etc ld.so.conf.d...

三種方法 2020 11 23

利用連線類,例項化得到連線物件 連線類 連線物件 new 連線類 cmd.executescalar cmd.excutereader 關注其中一條資料 物件名.read 獲取關注列所對應的值 console.writeline 物件名 name while 物件名.read 功能,聚焦下一行資料。...

動態載入Js檔案的三種方法

碰到需要載入多個js檔案的情況,使用選擇性的動態載入js,可以提高頁面顯示的速度和效率。下面介紹三種非同步執行載入js指令碼的方法。1 直接document.write 2 動態改變已有script的src 屬性 3 動態建立 script元素 注,這三種方法都是非同步的,所以在採用這類方法動態載入...