Linux下5種動態庫執行時搜尋路徑的方法

2021-07-10 15:57:25 字數 3400 閱讀 6305

**

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

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

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

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

#

#
void pos();

int main()

程式2: main.c

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

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

#

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

執行程式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後再試試。

# ./pos     /root/test/conf/lib 

#

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

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

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

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

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

#

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

#

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

例如:

#
#
程式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 -shared -fpci -o libpos.so pos.o

#

#
再執行程式pos試試。

#
程式pos執行成功,輸出的結果正是pos.c中的函式pos的執行結果。因此程式pos搜尋到的動態庫是./libpos.so。

以上介紹了三種指定動態庫搜尋路徑的方法,加上預設的動態庫搜尋路徑/lib和/usr/lib,共五種動態庫的搜尋路徑,那麼它們搜尋的先後順序是什麼呢?

在 介紹上述三種方法時,分別建立了動態庫./libpos.so、 /root/test/env/lib/libpos.so和/root/test/conf/lib/libpos.so。我們再用源程式 pos_lib.c(見程式5)來建立動態庫/lib/libpos.so,用源程式pos_usrlib.c(見程式6)來建立動態庫 /usr/lib/libpos.so。

#
根據程式pos的輸出結果可知,最先搜尋的是編譯目標**時指定的動態庫搜尋路徑。然後我們把動態庫./libpos.so刪除了,再執行上述命令試試。

rm: remove regular file `libpos.so'? y

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

#

根據程式pos的輸出結果可知,第2個動態庫搜尋的路徑是環境變數ld_library_path指定的。我們再把/root/test/env/lib/libpos.so刪除,執行上述命令。

rm: remove regular file `/root/test/env/lib/libpos.so'? y

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

#

第3個動態庫的搜尋路徑是配置檔案/etc/ld.so.conf指定的路徑。刪除動態庫/root/test/conf/lib/libpos.so後再執行上述命令。

rm: remove regular file `/root/test/conf/lib/libpos.so'? y

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

#

第4個動態庫的搜尋路徑是預設搜尋路徑/lib。我們再刪除動態庫/lib/libpos.so,執行上述命令。

rm: remove regular file `/lib/libpos.so'? y

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

#

最後的動態庫搜尋路徑是預設搜尋路徑/usr/lib。

綜合以上結果可知,動態庫的搜尋路徑搜尋的先後順序是:

1.編譯目標**時指定的動態庫搜尋路徑;

2.環境變數ld_library_path指定的動態庫搜尋路徑;

3.配置檔案/etc/ld.so.conf中指定的動態庫搜尋路徑;

4.預設的動態庫搜尋路徑/lib;

5.預設的動態庫搜尋路徑/usr/lib。

在上述1、2、3指定動態庫搜尋路徑時,都可指定多個動態庫搜尋路徑,其搜尋的先後順序是按指定路徑的先後順序搜尋的。對此本文不再舉例說明,有興趣的讀者可以參照本文的方法驗證。

Linux下5種動態庫執行時搜尋路徑的方法

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

Linux 指定執行時動態庫路徑

方法一 在配置檔案 etc ld.so.conf 中指定動態庫搜尋路徑。每次編輯完該檔案後,都必須執行命令 ldconfig 使修改後的配置生效。我們通過例 1 來說明該方法。例 1 我們通過以下命令用源程式 pos conf.c 見程式 1 來建立動態庫 libpos.so gcc fpic sh...

linux 設定執行時動態庫路徑

export ld library path mnt pub libs share ld library path path和ld library path本質都是變數,所謂變數的意思就是由別人賦值產生的,直覺往往會讓我們新增和減少這個變數本身的某些路徑,實際上這是不正確的。正確的做法是我們要去修改...