C++ 导出C+中的基类符号+;
如果需要导出类: (1) 如果是类继承(带有“virtual”),您必须将“PUBLIC”添加到“classx”定义中吗 (2) 在“X类”定义中始终添加“公共”是正确的方法吗C++ 导出C+中的基类符号+;,c++,linux,linker,shared-libraries,linker-errors,C++,Linux,Linker,Shared Libraries,Linker Errors,如果需要导出类: (1) 如果是类继承(带有“virtual”),您必须将“PUBLIC”添加到“classx”定义中吗 (2) 在“X类”定义中始终添加“公共”是正确的方法吗 例如,本文件的汇编: myclass.h #define PUBLIC __attribute__ ((visibility ("default"))) class BaseClass { public: PUBLIC BaseClass(); PUBLIC virtual ~BaseClass()
例如,本文件的汇编: myclass.h
#define PUBLIC __attribute__ ((visibility ("default")))
class BaseClass
{
public:
PUBLIC BaseClass();
PUBLIC virtual ~BaseClass();
};
class SonClass : BaseClass
{
};
myclass.cpp
#include "myclass.h"
BaseClass::BaseClass(){}
BaseClass::~BaseClass(){}
mytest.cpp
#include "myclass.h"
int main()
{
BaseClass bc;
SonClass sc;
return 0;
}
生成文件
CXX := g++
SOBJ := myclass.o
SLIB := myclasslib
BINOBJ := mytest.cpp
BINNAME := mytest
all: $(SOBJ) $(SLIB) $(BINNAME)
.cpp.o:
$(CXX) -fvisibility=hidden -c -fPIC $< -o $@
$(SLIB):
$(CXX) -shared -o lib$(SLIB).so $(SOBJ)
$(BINNAME):
$(CXX) $(BINOBJ) -o $@ -L. -l$(SLIB)
clean:
-$(RM) *.so
-$(RM) *.o
-$(RM) $(BINNAME)
注1: (1) 如果我从“~BaseClass”中删除“virtual”,我将编译它 (2) 如果我将“类基类”更改为“类公共基类”,我将编译它
注2: 我编译它时没有“mytest.cpp”中的“SonClass sc;”行 ,并检查符号:
nm -DC libmyclasslib.so
“X类公共”和“X类”之间的主要区别在于,第二个符号缺少此符号:
0000000000200e00 V typeinfo for BaseClass
00000000000009b9 V typeinfo name for BaseClass
0000000000200de0 V vtable for BaseClass
注3:
这个问题是因为rtti,如果我取消它(使用“-fno rtti”标志),所有的都将编译。最好将PUBLIC添加到类本身。它将导出所有可见和隐藏的成员。“添加PUBLIC是个好主意…”-但我必须这样做?将PUBLIC添加到类本身是个好主意。它将导出所有可见和隐藏的成员。“添加PUBLIC是个好主意……”但我必须这样做吗?
0000000000200e00 V typeinfo for BaseClass
00000000000009b9 V typeinfo name for BaseClass
0000000000200de0 V vtable for BaseClass