linux下鏈接庫文件默認搜索路徑

庫文件包含靜態庫文件和動態庫文件。

靜態庫就是在鏈接的時候加入到執行代碼中,成爲了代碼的一部分,所以生成的可執行文件就比較大,以後和靜態庫沒瓜葛了,自己隨便用了;動態庫是指運行的時候會鏈接到庫文件,如果沒找到就運行。

先介紹一下默認的庫搜索路徑,這些默認搜索路徑是不分動態庫和靜態庫的,都會在前面幾個路徑都找不到的情況來這兒找,所以這個是優先級最低的。

一般 Linux 系統把

/lib
/usr/lib
/usr/local/lib       (☆)

作爲默認的庫搜索路徑,所以使用在這三個目錄中的鏈接庫文件可直接被搜索到。

這三個路徑有什麼區別?一般用哪個呢?怎麼用呢?

很多應用都安裝在/usr/local下面。我們可以看automake工具,定義的默認前綴就就是/usr/local。

Directory variable  Default value  
 
prefix  /usr/local  
 
exec_prefix   ${prefix}  
 
bindir  ${exec_prefix}/bin  
 
libdir  ${exec_prefix}/lib  
 
…  

因爲,usr 指 Unix System Resource,/usr;/usr/bin目錄包含所有的命令、程序庫、文檔和其它文件,我們可以移動到這個目錄下,ls -al看下,都是系統預裝的可執行程序,會隨着系統的升級而改變,/usr/local/bin目錄是給用戶放置自己的可執行程序所以我們一般把我們可執行的腳本文件放到這個目錄

使用方法:

方法一:直接拷貝到/usr/local/lib目錄下;

方法二:你可以創建一個軟連接到/usr/local/lib,這樣就完成了映射,也是可以找到的。但是我想了想,萬一刪除了這個庫文件呢?那創建的軟連接不就失效了嗎。。所以感覺拷貝靠譜點。

  • sudo ln -s//home/zss/桌面/network_programming/libyolanda.a /usr/lib/libyolanda.a
    #這裏我沒有用/usr/local/bin的原因是我當時還不知道兩者的區別

 

靜態庫的搜索路徑:

  • 優先級最高的就是直接在鏈接的時候添加路徑

比如我們這裏有一個靜態庫,叫“libtest.a”吧。你要通過gcc去鏈接的話就要寫下面的指令:

gcc main.c -L. -ltest

就是說把main.c文件和libtest庫鏈接起來,這裏參數-Lpath,直接是連着一起寫的,所以這裏-L.就表示鏈接當前目錄的xxx文件,當gcc看到-ltest的時候, 會自動去找去找libtest.a。(不過我個人覺得這種方法不好用,因爲現在寫一個大型項目,是不是都用 cmake了啊,makefile感覺也用的少了吧,不太懂。。以後好回來填坑吧啊)

  • 使用環境變量"LIBRARY_PATH"指定鏈接庫搜尋路徑
#方法一:
export LD_LIBRARY_PATH=LD_LIBRARY_PATH:XXXX
# ":"是分割路徑的,後面xxxx表示庫所在的路徑,表示新加了xxxx搜索路徑
#缺點,這只是臨時添加,下次開機就沒了~

#方法二:
#首先找到你的配置文件.bashrc,你可以用locate .bashrc
locate .bashrc

#其次在打開這個文件
vim /home/zss/.bashrc

#把剛剛的路徑添加一遍
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:XXXX

#這樣的話,每次開機 ,.bashrc都會運行一遍,所以就又把這個XXXX路徑給加進去了 
  •  使用ld連接腳本中的 “SEARCH_DIR” 指定鏈接庫搜尋路徑

使用“ld –verbose”命令查看gcc的默認鏈接腳本中SEARCH_DIR參數,拷貝libsay.so到SEARCH_DIR指定路徑。

(這種方法我沒用過)

SEARCH_DIR("=/usr/local/lib/x86_64-linux-gnu"); SEARCH_DIR("=/lib/x86_64-linux-gnu");
SEARCH_DIR("=/usr/lib/x86_64-linux-gnu"); SEARCH_DIR("=/usr/local/lib64");
SEARCH_DIR("=/lib64"); SEARCH_DIR("=/usr/lib64"); SEARCH_DIR("=/usr/local/lib");
SEARCH_DIR("=/lib"); SEARCH_DIR("=/usr/lib"); SEARCH_DIR("=/usr/x86_64-linux-gnu/lib64");
SEARCH_DIR("=/usr/x86_64-linux-gnu/lib");
  • 最後一種就是一開始就說的默認搜索路徑。目前我是覺得直接拷貝到那裏蠻好的!

 

動態庫的搜索路徑:

  • 優先級最高的是編譯時指定的動態庫搜索路徑
gcc –Wl,-rpath=.
#選項–Wl,-rpath 以及 =來指定搜索路徑

同樣感覺用的比較少,因爲自己現在還沒有涉及到動態庫的鏈接,往往都是簡短的代碼鏈接一個靜態庫。

  • 環境變量LD_LIBRARY_PATH指定動態庫的搜索路徑。

這裏可以去參考靜態庫的,一模一樣。

  • 配置文件/etc/ld.so.conf中指定動態庫搜索路徑。

首先打開這個文件,跑到文件最後添加你動態庫的絕對路徑,然後idconfig修改生效都可以了。

  • 最後就是默認的庫搜索路徑了,就是一開始提到的三個。

 

關於《後臺開發核心技術與應用實踐》書中第127頁關於動態鏈接知識點,有一個題目,當時自己一直沒懂,今天參考別人文章的時候想到了別人爲什麼這樣解決。

題目:錯誤提示找不到動態庫文件libmymath.so

解決步驟:

cp libmymath.so /usr/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib
sudo idconfig

 有一點要特別注意,export LD_LIBRARY_PATH=...,這個等號是要直接接在PATH後面的,千萬不能打空格,否者會顯示command not found。還有就是我的疑惑在,既然已經把動態庫拷貝到目錄文件下,爲啥還要在環境變量LD_LIBRARY_PATH中添加/usr/lib嗎?這不是多此一舉嗎?後來我想到動態庫的搜索路徑也是有順序的,既然是動態庫,在運行時期鏈接,肯定是希望越快越好,所以我們再添加到LD_LIBRARY_PATH中,讓編譯器能更快的找到。不過這個全局變量也許會帶來一定危害吧!汗。在下文中提到了。不深究可以不看了 。

引文:https://blog.csdn.net/beizhengren/article/details/77978949

 

發佈了275 篇原創文章 · 獲贊 37 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章