2015-02-12 39 views
1

我的問題是我想開發一套我想公開的API。讓它成爲「SetA」。如何隱藏另一個包含的靜態庫的API?

我使用第三方靜態庫的一些API,如數學求解器。讓它成爲「SetB」。簡而言之,SetA使用SetB的API。

因爲我使用「SetB」,我必須包括它的頭文件和靜態庫文件。編譯時包含「SetB」庫,「SetA」庫包含「SetB」定義。

但是,由於版本或多重定義問題,我不希望用戶鏈接「SetB」的定義。我不想讓「SetA」的用戶必須處理這個問題,那麼是否有可能隱藏靜態鏈接的定義?

+0

對於你的''SetA'庫,你可以只提供用戶所需的功能,而不必暴露'SetB'的功能,對吧? – Mine 2015-02-12 06:46:33

回答

0

您應該使用工具鏈支持的可見性屬性。如果您使用的是clang或gcc,則可以使用__attribute__((visibility ("hidden"))))來隱藏符號。另一個建議here的選項是希望隱藏默認的符號可見性(gcc中的-fvisibility=hidden),並且在符號的聲明中僅選擇性地使用__attribute__ ((visibility ("default")))僅顯示應該成爲API一部分的符號。

此外,要從要鏈接的靜態庫中排除符號,可以使用鏈接器選項--exclude-libs lib1,lib2,...--exclude-libs ALL來指定所有靜態庫。

+1

我之前對此符號做過調查,但我認爲屬性設置僅適用於動態鏈接庫?如果「SetA」暴露爲靜態庫,它也可以工作嗎? – 2015-02-12 05:38:27

+0

增加了'--exclude-libs'。這會排除您要鏈接到的靜態庫的非導出符號。但是,我不確定這是否會影響您創建的存檔中的符號可見性。你可以在你創建的靜態庫上始終使用'objcopy --localize-hidden'。但不知道是否有更清潔的方式。試驗後會更新答案。 – Pradhan 2015-02-12 06:02:34

相關問題