從網上找的,**已經不可考,mark一下,備忘
linux 執行的時候,是如何管理共享庫(*.so)的?在 linux 下面,共享庫的尋找和載入是由 /lib/ld.so 實現的。 ld.so 在標準路經(/lib, /usr/lib) 中尋找應用程式用到的共享庫。
但是,如果需要用到的共享庫在非標準路經,ld.so 怎麼找到它呢?
目前,linux 通用的做法是將非標準路經加入 /etc/ld.so.conf,然後執行 ldconfig 生成 /etc/ld.so.cache。 ld.so 載入共享庫的時候,會從 ld.so.cache 查詢。
傳統上,linux 的先輩 unix 還有乙個環境變數:ld_library_path 來處理非標準路經的共享庫。ld.so 載入共享庫的時候,也會查詢這個變數所設定的路經。
ld_library_path=$ld_library_path:./lib
export ld_library_path
但是,有不少聲音主張要避免使用 ld_library_path 變數,尤其是作為全域性變數。這些聲音是:
* ld_library_path is not the answer -
* why ld_library_path is bad -
* ld_library_path - just say no -
解決這一問題的另一方法是在編譯的時候通過 -r選項指定 run-time path。
1. 往/lib和/usr/lib裡面加東西,是不用修改/etc/ld.so.conf的,但是完了之後要調一下ldconfig,不然這個library會找不到
2. 想往上面兩個目錄以外加東西的時候,一定要修改/etc/ld.so.conf,然後再呼叫ldconfig,不然也會找不到。
比如安裝了乙個mysql到/usr/local/mysql,mysql有一大堆library在/usr/local/mysql/lib下面,這時就需要在/etc/ld.so.conf下面加一行/usr/local/mysql/lib,儲存過後ldconfig一下,新的library才能在程式執行時被找到。
3. 如果想在這兩個目錄以外放lib,但是又不想在/etc/ld.so.conf中加東西(或者是沒有許可權加東西)。那也可以,就是export乙個全域性變數ld_library_path,然後執行程式的時候就會去這個目錄中找library。一般來講這只是一種臨時的解決方案,在沒有許可權或臨時需要的時候使用。
4. ldconfig做的這些東西都與執行程式時有關,跟編譯時一點關係都沒有。編譯的時候還是該加-l就得加,不要混淆了。
5. 總之,就是不管做了什麼關於library的變動後,最好都ldconfig一下,不然會出現一些意想不到的結果。不會花太多的時間,但是會省很多的事。
ld_library_path 這個環境變數是大家最為熟悉的,它告訴loader:在哪些目錄中可以找到共享庫。可以設定多個搜尋目錄,這些目錄之間用冒號分隔開。在linux下,還提供了另外一種方式來完成同樣的功能,你可以把這些目錄加到/etc/ld.so.conf中,然後呼叫ldconfig。當然,這是系統範圍內全域性有效的,而環境變數只對當前shell有效。按照慣例,除非你用上述方式指明,loader是不會在當前目錄下去找共享庫的,正如shell不會在當前目前找可執行檔案一樣。
linux生成 so,查詢編譯問題之雜文
rm rf file 強制刪除所有檔案 rm r file 對於大資料夾會出現?的提問 set wrap 換行 xz 檔案解壓xz d 檔案 查詢檔案 find name 檔名 linux下include包含絕對路徑,並且包含庫檔案很嚴格,例如在windows下包含即可使用printf,但是linu...
Linux編譯 so模板
目標檔名 target libmymath.so 生成的目標所放置的位置 target path 編譯引數 cc g 依賴庫名稱,如 libs lpthread libs 指定依賴庫位置,多個引用庫之間以空格分開,如 ldflags l usr lib l lib ldflags 向 提供巨集定義,...
svn如何提交 so檔案
使用android studio進行android開發,發現 so檔案死活上傳不上去。最初以為是android studio的問題,然後到資料夾下進行提交,發現差異統計的時候 so檔案始終都沒有統計進去,這樣的話自然就不可能把檔案提交上去了。檢視一下svn的配置吧!紅色框子圈出的就是問題所在,可以看...