1. 程式人生 > >linux 新增動態連結庫路徑

linux 新增動態連結庫路徑

1 2 export LD_LIBRARY_PATH=你的庫的路徑:$LD_LIBRARY_PATH echo $LD_LIBRARY_PATH

linux 預設回去/lib和/usr/lib目錄下查詢庫,可以通過ln建立軟連線

轉:

1. 連線和執行時庫檔案搜尋路徑到設定

庫檔案在連線(靜態庫和共享庫)和執行(僅限於使用共享庫的程式)時被使用,其搜尋路徑是在系統中進行設定的。一般 Linux 系統把 /lib 和 /usr/lib 兩個目錄作為預設的庫搜尋路徑,所以使用這兩個目錄中的庫時不需要進行設定搜尋路徑即可直接使用。對於處於預設庫搜尋路徑之外的庫,需要將庫的位置新增到庫的搜尋路徑之中。設定庫檔案的搜尋路徑有下列兩種方式,可任選其一使用:

(1). 在 /etc/ld.so.conf 檔案中新增庫的搜尋路徑。(或者在/etc/ld.so.conf.d 下新建一個.conf檔案,將搜尋路徑一行一個加入-junziyang)

將自己可能存放庫檔案的路徑都加入到/etc /ld.so.conf中是明智的選擇新增方法也極其簡單,將庫檔案的絕對路徑直接寫進去就OK了,一行一個。例如:

1 2 3 /usr/X11R6/lib /usr/local/lib /opt/lib

  需要注意的是:這種搜尋路徑的設定方式對於程式連線時的庫(包括共享庫和靜態庫)的定位已經足夠了,但是對於使用了共享庫的程式的執行還是不夠的。這是因為為了加快程式執行時對共享庫的定位速度,避免使用搜索路徑查詢共享庫的低效率,所以是直接讀取庫列表檔案 /etc/ld.so.cache 從中進行搜尋的。/etc/ld.so.cache 是一個非文字的資料檔案,不能直接編輯,它是根據 /etc/ld.so.conf 中設定的搜尋路徑由 /sbin/ldconfig 命令將這些搜尋路徑下的共享庫檔案集中在一起而生成的(ldconfig 命令要以 root 許可權執行)。

 因此,為了保證程式執行時對庫的定位,在 /etc/ld.so.conf 中進行了庫搜尋路徑的設定之後,還必須要執行 /sbin/ldconfig 命令更新 /etc/ld.so.cache 檔案之後才可以。ldconfig ,簡單的說,它的作用就是將/etc/ld.so.conf列出的路徑下的庫檔案快取到/etc/ld.so.cache 以供使用。因此當安裝完一些庫檔案,(例如剛安裝好glib),或者修改ld.so.conf增加新的庫路徑後,需要執行一下 /sbin/ldconfig使所有的庫檔案都被快取到ld.so.cache中,如果沒做,即使庫檔案明明就在/usr/lib下的,也是不會被使用的,結果編譯過程中抱錯,缺少xxx庫,去檢視發現明明就在那放著,搞的想大罵computer蠢豬一個。

 在程式連線時,對於庫檔案(靜態庫和共享庫)的搜尋路徑,除了上面的設定方式之外,還可以通過 -L 引數顯式指定。因為用 -L 設定的路徑將被優先搜尋,所以在連線的時候通常都會以這種方式直接指定要連線的庫的路徑。 

這種設定方式需要 root 許可權,以改變 /etc/ld.so.conf 檔案並執行 /sbin/ldconfig 命令。而且,當系統重新啟動後,所有的基於 GTK2 的程式在執行時都將使用新安裝的 GTK+ 庫。不幸的是,由於 GTK+ 版本的改變,這有時會給應用程式帶來相容性的問題,造成某些程式執行不正常。為了避免出現上面的這些情況,在 GTK+ 及其依賴庫的安裝過程中對於庫的搜尋路徑的設定將採用另一種方式進行。這種設定方式不需要 root 許可權,設定也簡單。

(2). 在環境變數 LD_LIBRARY_PATH 中指明庫的搜尋路徑。

設定方式:

1 export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH

可以用下面的命令檢視 LD_LIBRAY_PATH 的設定內容:

1 echo $LD_LIBRARY_PATH

至此,庫的兩種設定就完成了。

2.交叉編譯時候如何配置連線庫的搜尋路徑

 交叉編譯的時候不能使用本地(i686機器,即PC機器,研發機器)機器上的庫,但是在做編譯連結的時候預設的是使用本地庫,即/usr/lib, /lib兩個目錄。因此,在交叉編譯的時候,要採取一些方法使得在編譯連結的時候找到需要的庫。

    首先,要知道:編譯的時候只需要頭文件,真正實際的庫文件在連結的時候用到。 (這是我的理解,假如有不對的地方,敬請網上各位大俠指教) 然後,講講如何在交叉編譯連結的時候找到需要的庫。

(1)交叉編譯時候直接使用-L和-I引數指定搜尋非標準的庫文件和頭文件的路徑。例如:

1 arm-linux-gcc test.c -L/usr/local/arm/2.95.3/arm-linux/lib -I/usr/local/arm/2.95.3/arm-linux/include

2)使用ld.so.conf文件,將用到的庫所在文件目錄新增到此文件中,然後使用ldconfig命令重新整理快取。

(3)使用如下命令:

1 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/arm/2.95.3/arm-linux-lib

Linux下動態庫使用小結


1. 靜態庫和動態庫的基本概念

    靜態庫,是在可執行程式連線時就已經加入到執行碼中,在物理上成為執行程式的一部分;使用靜態庫編譯的程式執行時無需該庫檔案支援,哪裡都可以用,但是生成的可執行檔案較大。動態庫,是在可執行程式啟動時載入到執行程式中,可以被多個可執行程式共享使用。使用動態庫編譯生成的程式相對較小,但執行時需要庫檔案支援,如果機器裡沒有這些庫檔案就不能執行。

2. 如何使用動態庫

    如何程式在連線時使用了共享庫,就必須在執行的時候能夠找到共享庫的位置。linux的可執行程式在執行的時候預設是先搜尋/lib和/usr/lib這兩個目錄然後按照/etc/ld.so.conf裡面的配置搜尋絕對路徑。同時,Linux也提供了環境變數LD_LIBRARY_PATH供使用者選擇使用,使用者可以通過設定它來查詢除預設路徑之外的其他路徑,如查詢/work/lib路徑,你可以在/etc/rc.d/rc.local或其他系統啟動後即可執行到的指令碼新增如下語句:LD_LIBRARY_PATH =/work/lib:$(LD_LIBRARY_PATH)。並且LD_LIBRARY_PATH路徑優先於系統預設路徑之前查詢(詳細參考《使用 LD_LIBRARY_PATH》)。

    不過LD_LIBRARY_PATH的設定作用是全域性的,過多的使用可能會影響到其他應用程式的執行,所以多用在除錯。(LD_LIBRARY_PATH 的缺陷和使用準則,可以參考《Why LD_LIBRARY_PATH is bad》)。通常情況下推薦還是使用gcc的-R或-rpath選項來在編譯時就指定庫的查詢路徑,並且該庫的路徑資訊儲存在可執行檔案中,執行時它會直接到該路徑查詢庫,避免了使用LD_LIBRARY_PATH環境變數查詢。

3.庫的連結時路徑和執行時路徑

    現代聯結器在處理動態庫時將連結時路徑(Link-time path)和執行時路徑(Run-time path)分開,使用者可以通過-L指定連線時庫的路徑,通過-R(或-rpath)指定程式執行時庫的路徑,大大提高了庫應用的靈活性。比如我們做嵌入式移植時#arm-linux-gcc $(CFLAGS) –o target –L/work/lib/zlib/ -llibz-1.2.3 (work/lib/zlib下是交叉編譯好的zlib庫),將target編譯好後我們只要把zlib庫拷貝到開發板的系統預設路徑下即可。或者通過- rpath(或-R )、LD_LIBRARY_PATH指定查詢路徑。

相關推薦

linux 新增動態連結路徑

1 2 export LD_LIBRARY_PATH=你的庫的路徑:$LD_LIBRARY_PATH echo $LD_LIBRARY_PATH linux 預設回去/lib和/usr/lib目錄下查詢庫,可以通過ln建立軟連線 轉:

/usr/bin/ld: cannot find -lxxx 的解決辦法 新增動態連結的搜尋路徑

/usr/bin/ld: cannot find -lxxx 的解決辦法 在軟體編譯過程中,經常會碰到類似這樣的編譯錯誤: /usr/bin/ld: cannot find -lhdf5 這表示找不到庫檔案 libhdf5.so,若是其它庫檔案,則是 cannot find -lxxx 了

Linux動態連結的版本號以及ldconfig

動態連結庫的三個名字 1. realname, 真正的名字,一般情況下如果你有版本,應該在後面加上lib[libraryname].so.[version] eg: libtest.so.1.0.0 2. soname, 在編譯動態庫的時候指定的名字,這個名字將會被新增到

在/etc/ld.so.config中如何正確配置動態連結路徑

正確配置:include /etc/ld.so.conf.d/*.conf/home/ice/dynamiclibmulti/usr/lib63錯誤配置:include /etc/ld.so.conf.d/*.conf

codeblocks 下 新增動態連結

手動建立: (1)file->new->project->dynamic link library; 名字:dynamiclib 將工程自動生成的main.cpp檔案刪除,自動新增一個.c檔案(trydll.c) 將main.h 檔案刪除 建立一個tryd

gcc動態連結路徑

動態連結庫路徑 眾所周知,Linux動態庫的預設搜尋路徑是/lib和/usr/lib。動態庫被建立後,一般都複製到這兩個目錄中。當程式執行時需要某動態庫, 並且該動態庫還未載入到記憶體中,則系統會自動到這兩個預設搜尋路徑中去查詢相應的動態庫檔案,然後載入該檔案到記憶體中。l

Linux動態連結的建立和使用及C呼叫matlab動態問題

其實這個資料網路上已經很多了,但是還是有一些細節讓我搗鼓了很久,以及最近在做matlab mcc做成so檔案供給c++呼叫的時候的一些問題。 一、首先如何製作Linux下的so 檔案 【1】http://bbs.chinaunix.net/thread-1281954-1-

關於ubuntu中動態連結路徑的設定以及原始碼編譯python可用的opencv

ubuntu中設定動態連結庫的路徑有兩種方式: 在.bashrc中新增export LD_LIBRARY_PATH=lib_path:$LD_LIBRARY_PATH(其中lib_path表示動態連

Linux動態連結的建立和使用

1、連結庫的基本知識 庫是一種軟體元件技術,庫裡面封裝了資料和函式。它的使用,可以是程式模組化。在程式中使用,我們可以稱之為程式函式庫。 程式函式庫可分為3種類型:靜態函式庫(static libraries)、共享函式庫(shared lib

Linux將命令新增到PATH中及PA LD_LIBRARY_PATH用於指定查詢共享動態連結)時除了預設路徑之外的其他路徑

Linux將命令新增到PATH中部落格分類:linuxLinuxApacheBash簡單說PATH就是一組路徑的字串變數,當你輸入的命令不帶任何路徑時,LINUX會在PATH記錄的路徑中查詢該命令。有的話則執行,不存在則提示命令找不到。比如在根目錄/下可以輸入命令ls,在/u

靜態連結的編譯與使用 linux下的動態連結和靜態連結到底是個什麼鬼?(一)靜態連結的編譯與使用

linux下的動態連結庫和靜態連結庫到底是個什麼鬼?(一)靜態連結庫的編譯與使用       知識不等於技術,這句話真的是越工作的時間長越深有體會,學習到的知識只有不斷的實踐,才成真正在自已的心裡紮下根,成為自身的一部分,所以無論如何,我希望我的部落格可以

QtEmbedded-4.8.6-arm 編譯選擇從 動態變化到靜態 時,生成的Makefile連結路徑下如果有動態和靜態,優先選擇動態編譯應用

問題:QtEmbedded-4.8.6-arm 編譯選擇從 動態庫到靜態庫 時,發現的一個疑惑:,生成的Makefile連結庫路徑下如果有動態庫和靜態庫,優先選擇動態庫編譯應用 具體現象: 我最初是使用動態庫的 QtEmbedded-4.8.6-arm (編譯器選擇時,是 ./co

動態連結路徑配置-rpath/ld.so.conf/LD_LIBRARY_PATH

存放庫檔案到指定目錄,使可執行程式能夠找到庫檔案有三種方法: 第一種,通過ldconfig命令     ldconfig命令的用途, 主要是在預設搜尋目錄(/lib和/usr/lib)以及動態庫配置檔案/etc/ld.so.conf內所列的目錄下, 搜尋出

Linux下使用QT編寫和呼叫動態連結(.so檔案)

Linux下Qt建立和呼叫共享庫檔案.so 費了點功夫,總算get了編寫共享庫(Shared Library,Windows下稱為“動態連結庫”,即Dynamic Link Library)和呼叫的這個新技能! 動態連結庫的好處是不言而喻的,一個稍微複雜一點的程式,頂層設計的時候良好

在x64位Linux上生成動態連結必須使用編譯選項-fPIC的問題

在 Linux 下製作動態連結庫,“標準” 的做法是編譯成位置無關程式碼(Position Independent Code,PIC),然後連結成一個動態連結庫。經常遇到的一個問題是 -fPIC 是不是必需,因為好像不加經常也能正常執行,只是建立 .so 的時候

Linux中,.a和.so,其實就是靜態連結動態連結

詳細查了一下,.a與.so的區別,其實就是靜態連結庫與動態連結庫。有一篇博文,很詳細,附上鍊接:http://blog.csdn.net/nieyinyin/article/details/6890557   Linux下的.so是基於Linux下的動態連結,其功能和作用類

解決Linux動態連結的無法載入問題

在Linux環境下,根據第三方提供的動態連結庫和API利用C語言進行開發,編譯連結通過後,當執行時報錯說無法載入動態連結庫例如: 疑問就來了,動態連結庫我使用的全路徑(例如:/home/cyren/src/lib/libaivse000.so.5  ),檔案明明在指定的目錄

linux 把靜態連結.a連結動態連結.so裡

個人分類: linux編譯連結         最近公司的專案中突然出現了這樣一個需求,我簡化再概括後如下:有兩大模組,其中一個模組a最終編譯出一個可執行檔案exec_a,另一個模組b編譯出一個動態連結庫lib_b.so被模組a的程式exec_a所連結。現在模組b中分出

Linux下執行時呼叫動態連結.so的三種方法(筆記)

在/etc/ld.so.conf.d/下建立xxx.conf,在文字中加入.so所在路徑,如:/usr/xxx等等,然後使用相應ldconfig命令使之生效。 將.so所在路徑新增為LD_LIBRARY_PATH環境變數。 在編譯命令中使用-Wl,-rpath

Linux動態連結同名符號裝載問題(二)

上一篇《Linux動態連結庫同名符號裝載問題(一)》中提到了動態連結的一些問題,本文主要討論動態載入時符號衝突的問題。PART1:RTLD_DEEPBIND開啟動態連結導致段錯誤的現象可執行程式A通過dlopen動態載入library.so,有可能出現library.so中和