Linux下如何解決動態庫的連接問題

    關於動態庫和靜態庫,這裏很少解釋,如何建立屬於本身的動態庫和靜態庫,以前有提過,詳細內容戳連接
mysql


    靜態庫是一種以空間換取時間和移植性的作法,一些狀況下確實有着必定的意義,可是一些狀況下,咱們本身編寫的簡單項目,在絕大多數的機器上不存在移植性問題,是沒有必要採用靜態編譯的。並且,在一些大型項目中,咱們很難避免去使用到開源庫,舉個例子,若是咱們只是單純引用了mysql數據庫的幾個接口,有必要將整個mysql源文件所有編譯嗎?代價未免太大。一般的作法,是將mysql的include
sql

和lib目錄打包以後,一塊兒進行發佈,來加強可移植性,也就是今天這裏說的動態編譯。shell


    可是,動態編譯默認狀況下,只會去系統默認指定的目錄下進行查找lib***.so文件,甚至咱們在Makefile中使用-L選項指明瞭LIB目錄,編譯不會出錯,但在運行的時候,會出現下面這種報錯:
數據庫

    

./cgi_select: error while loading shared libraries: libmysqlclient.so.18: 
    cannot open shared object file: No such file or directory


    解決這個問題,網上給出的方法挺多,這裏不會所有列出,給出最經常使用的方法:
ide

一、環境變量。使用export導入環境變量LD_LIBRARY_PATH,指明搜索路徑。這個環境變量是臨時指定動態庫的搜索路徑,是綁定終端的,至於什麼緣由,瞭解過Linux的同窗應該知道,這裏很少解釋,爲了說明問題,這裏截圖給出,具體用法以下:工具

wKiom1kg-smzgGqsAABZaxT8YqE573.png


    再次說明,這種作法只是臨時生效,在測試的時候爲了方即可以使用,可是真正的項目發佈,通常不會使用這種作法,由於須要在客戶機器上建立環境變量以後才能夠運行,我嘗試了多種作法,想把命令放到腳本當中自動化去執行,但限於我的能力,還沒有跨越子shell這一關。測試


二、第二種作法就顯得更加有效。在/etc/ld.so.conf文件中,指明瞭動態庫的搜索路徑,通常請款下,文件內容爲ui

include ld.so.conf.d/*.conf

代表,/etc/ld.so.conf.d目錄下的所有*.conf文件中保存的都是動態庫的搜索路徑。這麼說可能不太好理解,進入目錄,隨意打開一個文件,你就會明白,每一個文件中只有一條或幾條路徑,以下spa

[root@bogon ld.so.conf.d]# cat qt-i386.conf 
/usr/lib/qt-3.3/lib
[root@bogon ld.so.conf.d]# cat mysql-i386.conf
/usr/lib/mysql

    每個工具的動態庫,都有着本身的動態庫路徑,所以,咱們能夠在該目錄下建立本身的*.conf文件,文件中保存本身指定的動態庫路徑便可,我的絕對,Linux對動態庫搜索路徑的封裝作的真心不錯。blog

    固然更改其餘*.conf文件或建立本身的動態庫鏈接目錄配置文件後,須要使用ldconfig命令使之生效。

[root@bogon ld.so.conf.d]# ldconfig 


三、其餘的作法就是一些很非主流的作法了,將你所須要的動態庫文件直接放入系統默認路徑,坦白講,這樣作法沒有問題,可是這是在給本身埋地雷,早晚有一天會出大問題。


四、另外還有一種比較生僻的作法,可是開源工程中會用到。使用gcc的選項確實能夠實現,-Wl -rpath指定路徑,我的來講,不多使用這種作法,gcc/g++是一款很強大的編譯工具,提供了上百個選項,有一大部分可能一生用不到,用到去查就能夠了,沒有必要太過深究。



    -----muhuizz整理

相關文章
相關標籤/搜索