C++ -fvisibility = hidden -fvisibility-inlines-hidden

nix*_*get 17 c++ linux visibility gnu dynamic-linking

我有一个关于C++可见性属性的问题.我已经阅读了http://gcc.gnu.org/wiki/Visibility,但我不太明白它是如何工作的.

我希望在我的一些共享库中隐藏可见性.我相信这意味着符号被隐藏了吗?

你打算如何链接共享库呢?有特殊的方式吗?如果我链接它通常如何链接它不起作用.

有谁可以帮助我吗.

CB *_*ley 32

-fvisibility=hidden默认情况下隐藏所有符号.

接下来要做的是选择哪些函数对于链接到库的用户是可见的,并通过用可见属性标记它们使它们可见.

例如

void __attribute__((visibility("default"))) Exported()
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

  • 当然,你会想要创建一个像`MYLIB_PUBLIC`这样的宏或类似的东西来使它更清洁. (3认同)

Aru*_*mar 6

它减少了保留共享对象私有的不必要的符号信息。

考虑一个共享对象,它有 10,000 多个符号(函数/全局变量),但其中只有 100 个是库用户可访问的公共函数。我们可以将仅有的 100 个函数设为对其他人可见,其余 9,900 个符号设为私有。

它也会减少共享对象的大小,因为它的重定位表将只有 100 个信息符号。将此标志与-ffunction-sections -fdata-sections一起使用将通过具有与这 100 个符号相关的定义进一步减小共享对象的大小。