**
方法一:在配置檔案/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本質都是變數,所謂變數的意思就是由別人賦值產生的,直覺往往會讓我們新增和減少這個變數本身的某些路徑,實際上這是不正確的。正確的做法是我們要去修改...