我有一個關於C++可見性屬性的問題。我已閱讀http://gcc.gnu.org/wiki/Visibility,但我不太明白它是如何工作的。C++ -fvisibility = hidden -fvisibility -inlines-hidden
我想使用可見性隱藏在我的一些共享庫上。我相信這意味着這些符號是隱藏的?
那麼你打算如何鏈接共享庫呢?有沒有特別的方法?如果我將它鏈接起來,它通常如何鏈接它不起作用。
有人可以幫助我。
我有一個關於C++可見性屬性的問題。我已閱讀http://gcc.gnu.org/wiki/Visibility,但我不太明白它是如何工作的。C++ -fvisibility = hidden -fvisibility -inlines-hidden
我想使用可見性隱藏在我的一些共享庫上。我相信這意味着這些符號是隱藏的?
那麼你打算如何鏈接共享庫呢?有沒有特別的方法?如果我將它鏈接起來,它通常如何鏈接它不起作用。
有人可以幫助我。
-fvisibility=hidden
使所有符號隱藏默認。
然後,您需要做的是選擇哪些功能,您希望用戶可以看到鏈接到您的庫的用戶,並通過用可見屬性標記它們使其可見。
E.g.
void __attribute__((visibility("default"))) Exported()
{
// ...
}
它減少了對共享對象私有的保留不必要的符號信息。
考慮一個具有超過10,000個符號(函數/全局變量)的共享對象,但其中只有100個是可從庫用戶訪問的公共函數。我們可以將其餘的9,900個符號的其他&作爲唯一可見的100個函數作爲私有。
它也會減少共享對象的大小,因爲它是一個重定位表將只有100個符號信息。使用該標誌以及-ffunction-sections -fdata-section將通過具有與該100個符號相關的定義來進一步減小共享對象大小。
謝謝。這真的有幫助。 – nixgadgets 2010-08-25 23:45:18
自然你會想創建一個像'MYLIB_PUBLIC'或類似的宏來使這個更清潔。 – 2014-01-27 13:53:12