C++ 为什么在我使用-fvisibility=hidden时仍然导出构造函数
我有一个甲级:C++ 为什么在我使用-fvisibility=hidden时仍然导出构造函数,c++,gcc,C++,Gcc,我有一个甲级: class A { public: A() {} virtual ~A() {} void Func(); }; 另一个类M使用A。我想创建libM.so,它隐藏了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”时,它仍然有 00000
class A
{
public:
A() {}
virtual ~A() {}
void Func();
};
另一个类M使用A。我想创建libM.so,它隐藏了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()
我在google上搜索这个问题,发现了另一个gcc选项:“-fvisibility inlines hidden”到隐藏的内联函数,但即使在编译A.o时添加这个选项,我仍然得到了相同的结果
g++ -c A.cc -fPIC -fvisibility=hidden -fvisibility-inlines-hidden
为什么“-fvisibility inlines hidden”没有效果?如何防止A::A()出现在libM.so的导出符号中?多谢各位 感谢迈克·西摩。我应该在编译M.cc时添加隐藏的-fvisibility内联线
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
内联构造函数将在两个翻译单元中定义,因此您可能需要这两个单元的编译器选项,而不仅仅是
A.cc
。(不是答案,因为我现在没有电脑来测试我的猜测)非常感谢!是的,没错。我应该在编译M.cc时添加-fvisibility inlines hidden。请用您发现的答案回答您自己的问题,并接受它以解决此问题。但我尝试了,发现-fvisibility inlines hidden
无法隐藏A的符号。相反,仅对前两行使用-fvisibility=hidden
将删除libM.so中的符号。我使用的是gcc 5.4.0