1.3 使用 ldd 命令找不到對應的共享庫檔案
通常情況下,許多開放源**的程式或函式庫都會預設將自己安裝到/usr/local
目錄下的相應位置, 如:/usr/local/bin
或/usr/local/lib
, 以便與系統自身的程式或函式庫相區別; 而許多 linux 系統的/etc/ld.so.conf
檔案中預設又不包含/usr/local/lib
。因此,往往會出現已經安裝了共享庫,但是卻無法找到共享庫的情況。
具體解決辦法如下:
檢查 /etc/ld.so.conf 檔案,如果其中缺少 /usr/local/lib 目錄,就新增進去;
!!! 注意 !!!: 在修改了/etc/ld.so.conf
檔案或者在系統中安裝了新的函式庫之後,需要執行ldconfig
命令 ,該命令用來重新整理系統的共享庫快取(為了減少共享庫系統的庫搜尋時間,共享庫系統維護了乙個共享庫 soname 的快取檔案/etc/ld.so.cache
)。
2.1 建立so:
% gcc –shared –wl,-soname,libname.so.x –o libname.x.y.z x.o
可以在編譯動態庫的同時給動態庫建立soname(libname.so.x)
,libname.x.y.z
是動態庫的realname,其中:
如果你沒有改大版本號,這時只需要把新動態庫庫覆蓋掉舊動態庫就行了;但如果大版本號改了,那新舊動態庫要同時存在,新程式需要新soname,舊程式需要舊soname。
% gcc test.c –lname –l .
-l . 指定linkname(libname.so)
所在的目錄,它是到實際的庫檔案的乙個軟鏈結,libname.x.y.z
檔案中會有soname的資訊(libname.x)
, ld把soname的資訊儲存在生成的可執行**中; 鏈結時一般是鏈結到最新的庫檔案,但不需要知道具體的版本號。
2.3 執行時載入:
程式執行的時候就會載入soname(libname.x)
–>realname(libname.x.a.b)
並執行。
2.4 相關檔案彙總
#lib 目錄中每個庫檔案一般會有以下幾個相關檔案
#鏈結的時候用,把實際檔案的soname資訊包含到可執行檔案中
lrwxrwxrwx 1 root root 22
2014-09-17
17:46 libname.so -> libname.so.0.0.0
#執行的時候用,根據可執行檔案中的soname資訊查詢實際的庫檔案
lrwxrwxrwx 1 root root 22
2014-09-17
17:46 libname.so.0 -> libname.so.0.0.0
#實際的庫檔案
-rwxr-xr-x 1 root root 18572
2009-06-05
17:28 libname.so.0.0.0
參見: Makefile知識小記
gcc是linux中的編譯器,它是通過某種規則來進行編譯的,在這之前還有乙個linux自帶的構建器叫make,make也需要通過某種規則來構建,而這些規則就通過makefile來設定。makefile檔案的命名可以是makefile或makefile。makefile中的規則 三部分 目標 依賴 命...
Sqlite知識小記
1 sqlite3使用top的用法 sqlite3 sql是用limit這樣的語法來實現的 例 select from table where name xiao ming order by id limit 0,5 意思為查詢table表裡,欄位name為xiao ming的記錄 根據欄位id顯示...
RunLoop的知識小記
runloop字面上的意思是,執行迴圈 其基本作用 保持程式的持續執行 節省cpu資源,提高程式效能 該做事時做事,該休息時休息 1.main函式中的runloop int main int argc,char ar nsrunloop 是基於cfrunloopref的一層oc包裝,所以了解runl...