如果您需要导出课程:
(1)如果是类继承(使用"虚拟"),你必须添加" PUBLIC"到" X"定义
(2)这是添加始终" PUBLIC"的正确方法。到" X"定义
例如汇编:
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)
此链接器错误失败:
/tmp/ccloiGSt.o:(.rodata._ZTI8SonClass[_ZTI8SonClass]+0x18): undefined reference to `typeinfo for BaseClass'
<小时/> 注1:
(1)如果我删除&#34;虚拟&#34;来自&#34; ~BaseClass&#34;我编译了。
(2)如果我更改&#34;类BaseClass&#34;到&#34;类PUBLIC BaseClass&#34;我编译了。
<小时/> 注2:
我编译它没有行&#34; SonClass sc;&#34;来自&#34; mytest.cpp&#34; ,并检查符号:
nm -DC libmyclasslib.so
&#34;类PUBLIC X&#34;之间的主要区别和&#34; X&#34;是第二个缺少这个符号:
0000000000200e00 V typeinfo for BaseClass
00000000000009b9 V typeinfo name for BaseClass
0000000000200de0 V vtable for BaseClass