为什么我使用-fvisibility = hidden时构造函数仍然会被导出

4

我有一个A类:

class A
{
public:
   A() {}
   virtual ~A() {}

   void Func();
};

我想创建一个名为libM.so的库,其中使用了A类。我希望该库隐藏所有A类的符号。我使用以下脚本进行编译:

g++ -c A.cc -fPIC -fvisibility=hidden
g++ -c M.cc -fPIC
g++ -shared -z defs -o libM.so M.o A.o

但是当我使用"nm -DC libM.so"时,仍然存在。
0000000000000c78 W A::A()
0000000000000c78 W A::A()

我在谷歌上搜索了这个问题,并找到了另一个gcc选项:“-fvisibility-inlines-hidden”来隐藏内联函数,但即使我在编译A.o时添加了这个选项,仍然得到相同的结果。
g++ -c A.cc -fPIC -fvisibility=hidden -fvisibility-inlines-hidden

为什么 "-fvisibility-inlines-hidden" 没有效果?如何防止 A::A() 出现在 libM.so 的导出符号中?非常感谢!

4
内联构造函数将在两个翻译单元中定义,因此您可能需要为两个选项开启编译器选项,而不仅仅是 A.cc。(这不是一个答案,因为我此时没有可用于测试猜测的计算机) - Mike Seymour
非常感谢!是的,没错。我在编译M.cc时应该加上-fvisibility-inlines-hidden。 - cgspwei
请用您所发现的内容回答自己的问题,并接受它以关闭此问题。 - vonbrand
1个回答

1
感谢Mike Seymour。我在编译M.cc时应该添加-fvisibility-inlines-hidden。
g++ -c A.cc -fPIC -fvisibility=hidden -fvisibility-inlines-hidden
g++ -c M.cc -fPIC -fvisibility-inlines-hidden
g++ -shared -z defs -o libM.so M.o A.o

但我尝试了,发现-fvisibility-inlines-hidden无法隐藏A的符号。相反,仅使用-fvisibility=hidden用于前两行将会在libM.so中删除A的符号。我正在使用gcc 5.4.0。 - flm8620

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接