C++ 从共享库中剥离符号似乎不起作用

C++ 从共享库中剥离符号似乎不起作用,c++,shared-libraries,visibility,hidden,strip,C++,Shared Libraries,Visibility,Hidden,Strip,我试图使用strip命令从共享库中剥离非公共符号,但当我随后应用“nm-C-D”时,仍然可以看到所有符号 我已经阅读了这篇文章和其他文章:以及gcc维基: 但在我的示例代码中,建议的解决方案似乎不起作用 我声明了两个简单的类,一个保持可见,另一个被删除。对于公共属性,我在源代码中声明了\uuuuuuuu属性((可见性(“默认”)) 当我编译并使用-fvisibility=hidden链接并随后在共享库上运行“strip--strip all--discard all”时,这两个类在T(ext)部

我试图使用strip命令从共享库中剥离非公共符号,但当我随后应用“nm-C-D”时,仍然可以看到所有符号

我已经阅读了这篇文章和其他文章:以及gcc维基: 但在我的示例代码中,建议的解决方案似乎不起作用

我声明了两个简单的类,一个保持可见,另一个被删除。对于公共属性,我在源代码中声明了
\uuuuuuuu属性((可见性(“默认”))

当我编译并使用-fvisibility=hidden链接并随后在共享库上运行“strip--strip all--discard all”时,这两个类在T(ext)部分仍然可见

这是我的头文件:

#pragma一次
#如果=4
#定义DLL\u公共属性(可见性(“默认”))
#否则
#定义DLL_公共
#恩迪夫
类DLL\u公共公共类
{
公众:
PublicClass()=默认值;
~PublicClass()=默认值;
void doSomethingPublic();
};
类私有类
{
公众:
PrivateClass()=默认值;
~PrivateClass()=默认值;
void doSomethingPrivate();
};
这是来源:

#包括
#包括“test.hpp”

void PublicClass::doSomethingPublic(){std::cout您需要使用
-fvisibility=hidden
进行编译:

$ g++ -fvisibility=hidden -shared -fPIC tmp.cc
$ readelf -D -sW a.out | grep doSomething
    9  16: 000000000000092c    58 FUNC    GLOBAL DEFAULT  10 _ZN11PublicClass17doSomethingPublicEv

很好,抱歉,我粘贴了错误的命令行。我最初指定了-fvisibility=hidden,只是没有检查它是否有任何区别。我将编辑帖子。@joggerwolf我恐怕无法在Ubuntu 18.04上用stock g++7.4重新设置此行为(在
nm
的输出中没有
doSomethingPrivate
符号)。
/usr/local/bin/c++
来自何处?感谢您的检查。我假设它直接来自发行版,现在正试图用示例重现它,它按预期工作:-(不幸的是,它在我用cmake设置的实际项目中仍然不起作用,由于IP原因,我无法共享。我检查了详细的cmake输出,并且-fvisibility=hidden如预期的那样出现在命令行上,但是在使用objdump-t查看对象文件时,在一些符号处有一个.hidden指示,但比我想象的要少得多。)pect,因为我只用visibility default标记了一个类。@joggerwolf“我假设它直接来自发行版”-通常发行版不会安装任何东西到
/usr/local
(例如,我默认的Ubuntu 18安装没有
c++
),你能检查一下这个可执行文件来自哪里吗(通过
dpkg-S
)?是否使用库存
g++
而不是
/usr/local/bin/c++
进行复制?