Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么在我使用-fvisibility=hidden时仍然导出构造函数_C++_Gcc - Fatal编程技术网

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