我的問題是我想開發一套我想公開的API。讓它成爲「SetA」。如何隱藏另一個包含的靜態庫的API?
我使用第三方靜態庫的一些API,如數學求解器。讓它成爲「SetB」。簡而言之,SetA使用SetB的API。
因爲我使用「SetB」,我必須包括它的頭文件和靜態庫文件。編譯時包含「SetB」庫,「SetA」庫包含「SetB」定義。
但是,由於版本或多重定義問題,我不希望用戶鏈接「SetB」的定義。我不想讓「SetA」的用戶必須處理這個問題,那麼是否有可能隱藏靜態鏈接的定義?
我的問題是我想開發一套我想公開的API。讓它成爲「SetA」。如何隱藏另一個包含的靜態庫的API?
我使用第三方靜態庫的一些API,如數學求解器。讓它成爲「SetB」。簡而言之,SetA使用SetB的API。
因爲我使用「SetB」,我必須包括它的頭文件和靜態庫文件。編譯時包含「SetB」庫,「SetA」庫包含「SetB」定義。
但是,由於版本或多重定義問題,我不希望用戶鏈接「SetB」的定義。我不想讓「SetA」的用戶必須處理這個問題,那麼是否有可能隱藏靜態鏈接的定義?
您應該使用工具鏈支持的可見性屬性。如果您使用的是clang或gcc,則可以使用__attribute__((visibility ("hidden"))))
來隱藏符號。另一個建議here的選項是希望隱藏默認的符號可見性(gcc中的-fvisibility=hidden
),並且在符號的聲明中僅選擇性地使用__attribute__ ((visibility ("default")))
僅顯示應該成爲API一部分的符號。
此外,要從要鏈接的靜態庫中排除符號,可以使用鏈接器選項--exclude-libs lib1,lib2,...
或--exclude-libs ALL
來指定所有靜態庫。
我之前對此符號做過調查,但我認爲屬性設置僅適用於動態鏈接庫?如果「SetA」暴露爲靜態庫,它也可以工作嗎? – 2015-02-12 05:38:27
增加了'--exclude-libs'。這會排除您要鏈接到的靜態庫的非導出符號。但是,我不確定這是否會影響您創建的存檔中的符號可見性。你可以在你創建的靜態庫上始終使用'objcopy --localize-hidden'。但不知道是否有更清潔的方式。試驗後會更新答案。 – Pradhan 2015-02-12 06:02:34
對於你的''SetA'庫,你可以只提供用戶所需的功能,而不必暴露'SetB'的功能,對吧? – Mine 2015-02-12 06:46:33