防止Linux庫so中的介面衝突

2021-09-26 07:33:22 字數 661 閱讀 2481

使用vs編譯so庫,很多復用的cpp檔案在不同的so中,呼叫這些so的時候會有崩潰等等各種問題,就是因為雖然復用了介面,但是內部實現不完全相同,而linux使用介面又與windows不一樣,導致不是理想狀態使用自己庫中的函式介面,乙個簡單的解決辦法,使用顯示指定介面:-wl,--retain-symbols-file=/home/projects/$(projectname)/retain_symbols.sys -wl,--version-script=/home/projects/$(projectname)/version_script.map,這兩個檔案裡的內容也很簡單,

retain_symbols.sys:

test_api1

test_api2

version_script.map:

;
基本這樣就可以解決問題了,不用去挨個改介面名字了。

還有一種是用-fvisibility=hidden的方式,在**級別就做出變動,我還沒有嘗試過。

更新,還有乙個辦法,是研究android studio編譯庫衝突時發現的,使用-wl,-bsymbolic引數,限定庫優先使用內部函式,在ld報錯時查詢到的: ld的引數說明,也是看了這個引數說明才知道,上面的指定函式介面的引數與-s、-s(strip)的使用是衝突的。

linux中靜態庫 a 和動態庫 so

自 靜態庫 靜態庫在編譯的時候被固定在了可執行檔案中,而不是放在系統的某個地方由ld.so載入。這種做法好的一面是可執行檔案自己包含了所需的所有庫文 件,並不依賴於系統中的其他 也不會出現庫檔案缺失的情況。你可以把這些 複製給任何人,而它們保證可以工作。不好的一面就是可執行檔案不必要的增 大了,而且...

linux 中的 so和 a檔案

下面是關於.so的介紹 一 引言 通常情況下,對函式庫的鏈結是放在編譯時期 compile time 完成的。所有相關的物件檔案 object file 與牽涉到的函式庫 library 被鏈結合成乙個可執行檔案 executable file 程式在執行時,與函式庫再無瓜葛,因為所有需要的函式已拷...

修改so庫中的依賴名

以suitespares中的libcholmod.so.3.0.13,先使用命令readelf d libcholmod.so.3.0.13讀取其need庫如下 標記 型別 名稱 值 0x00000001 needed 共享庫 libm.so.6 0x00000001 needed 共享庫 liba...