動態庫知識小記

2021-08-03 15:15:19 字數 1868 閱讀 5437

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...