C C 中控制動態庫的符號可見性

2021-08-15 19:59:49 字數 477 閱讀 9989

寫了乙個動態庫供客戶使用,此庫使用了一些第三方靜態庫,無奈客戶也使用了這些第三方庫,從而產生了符號衝突。

所以需要隱藏此庫中第三方庫的匯出符號。

static 關鍵字

匯出列表

指定 visibility 屬性

最終選擇方案三,即利用gnu的visibility 屬性。

(1)修改cmakelist.txt,新增如下屬性,從而使所有符號預設不匯出。

set(cmake_cxx_visibility_preset hidden)

set(cmake_c_visibility_preset hidden)

(2)設定visibility屬性,匯出so的關鍵符號

void __attribute__ ((visibility ("default"))) fun();
1.

2.3.

4.

控制符號的可見性

在普通的c語言中,如果您希望將函式或者變數限制在當前檔案中,需要對其使用static關鍵字。然而,在乙個包含很多檔案的共享庫中,如果您希望某個符號可以被共享庫內部的幾個檔案訪問,而又不提供給外部,則對符號進行隱藏處理就會比較困難。大多數的聯結器都提供一些便利的方法來隱藏或者顯示模組中所有的符號,但如...

GCC的符號可見性 解決多個庫同名符號衝突問題

問題 最近專案遇到一些問題,場景如下 主程式依賴了兩個庫liba的funca函式和libb的funcb函式。示意的 main.cpp 如下 include int funca int,int int funcb int,int int main liba示意實現 liba.cpp 如下 int su...

C C 中變數的可見性與生命期區別的本質原因

可見性與生命期 可見性又可稱為 作用域,它是 棧 這種儲存方式的表現形式。不管是全域性的可見性 全域性作用域 還是區域性可見性 區域性作用域 從乙個物件 或稱為變數 例項 的入棧 開始可見 到其出棧 變成不可見 是該物件的整個的作用域。可見性與生命期是兩個分立的概念,但似乎又存在這某種聯絡。比如 如...