1. 程式人生 > >(更新1)ubuntu下的動態連結庫(.so )問題(以opencv為例)

(更新1)ubuntu下的動態連結庫(.so )問題(以opencv為例)

首先需要指出,如果你的shell已經是root管理情況,那就直接按照轉載的方法執行就可以了。

如果你是非root的正常訪問模式,那就在執行每一條指令的最開始加入sudo,以下為非root模式。

例如,需要配置opencv的動態連結庫,那首先開啟目錄

cd /etc/ld.so.conf

然後,新建一個名為opencv.conf的檔案,並在檔案裡新增你所安裝的opencv的動態庫絕對路徑,可以是多個路徑

sudo gedit opencv.conf

如果你沒有安裝gedit請先安裝,如果你在該路徑下沒有opencv.conf檔案,上一條指令會直接新建,有的話就會直接用gedit開啟。開啟後,在裡面新增路徑並儲存(Ctrl+s),注意是絕對路徑

/usr/lib

/XX/XX/XX/lib

這裡/XX/XX/XX/lib表示任意的路徑。最後,在shell中執行sudo ldconfig即可

除此之外,還有一種方法,就是在你需要執行指令的終端shell里加入臨時的環境變數,例如 export LD_LIBRARY_PATH=/home/xxx/artoolkitx-master/Source/depends/linux/lib:$LD_LIBRARY_PATH ldconfig
其中$LD_LIBRARY_PATH表示你已經有的庫路徑,冒號:是分隔符,/home/xxx/artoolkitx-master/Source/depends/linux/lib表示你現在需要的路徑。之後,我們可以通過echo $LD_LIBRARY_PATH來檢視當前的環境變數,千萬記住,這個只是臨時的,意味著你以後要用的任何時候,只要開啟了新的終端,就必須重新新增一次.

以上做法,只是臨時設定變數 LD_LIBRARY_PATH ,下次開機,一切設定將不復存在;把這個值持續寫到 LD_LIBRARY_PATH 裡可以在 ~/.bashrc 或者 ~/.bash_profile 中加入 export 語句,前者在每次登陸和每次開啟 shell 都讀取一次,後者只在登陸時讀取一次。加到 ~/.bashrc 中,在該檔案的未尾,可採用如下語句來使設定生效:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

修改完後,記得關掉當前終端並重新開啟一個新的終端,從而使上面的配置生效。
不過這個環境變數是基於shell的,也就是說只有在當前設定了的shell裡才會有作用,因此每次開啟新的shell執行程式不停地設定LD_LIBRARY_PATH,是一件非常麻煩的事情,所以我們就會想有不有什麼一勞永逸地方法,使得設定之後就不用再去設定了?答案是肯定的,即在~/目錄下開啟.bash_profile檔案,設定環境變數如下:
LD_LIBRARY_PATH=dir:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH

LD_LIBRARY_PATH  這個環境變數是大家最為熟悉的,它告訴loader:在哪些目錄中可以找到共享庫。可以設定多個搜尋目錄,這些目錄之間用冒號分隔開。在linux下,還 提供了另外一種方式來完成同樣的功能,你可以把這些目錄加到/etc/ld.so.conf中,然後呼叫ldconfig。當然,這是系統範圍內全域性有效 的,而環境變數只對當前shell有效。按照慣例,除非你用上述方式指明,loader是不會在當前目錄下去找共享庫的,正如shell不會在當前目前找 可執行檔案一樣。



------------------------------------------------------------------以下為轉載內容----------------------------------------------------------------------------

一、庫檔案的搜尋路徑:

1、在配置檔案/etc/ld.so.conf中指定動態庫搜尋路徑(需要新增其它庫檔案的路徑,在檔案的最後新增具體的路徑即可 [ 如:/usr/local/lib ],新增後儲存退出,然後在命令列ldconfig

2、通過環境變數LD_LIBRARY_PATH指定動態庫搜尋路徑(當通過該環境變數指定多個動態庫搜尋路徑時,路徑之間用冒號":"分隔)

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

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

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

搜尋的先後順序是:

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

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

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

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

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

二、Shell可執行程式命令檔案搜尋路徑:

1.檢視所有的搜尋路徑:echo $PATH

2.新增新的路徑:

1)只對當前shell視窗有效:

export PATH=$PATH:/new path

2)對所有視窗有效:

修改當前使用者的.bash_profile檔案,在PATH=$PATH……後新增":/new path";

儲存退出後,需要在當前視窗中執行". .bash_profile",更新配置,之後用echo $PATH顯示更新後的路徑,可以看到新加入的路徑;

注意:在重新登入前所有新開啟的shell視窗要用到新的路徑都需要執行". .bash_profile",更新配置,因為.bash_profile檔案的內容在使用者登入時就讀取了

轉至點選開啟連結