用C ++导出基类符号

时间:2016-11-23 09:15:16

标签: c++ linux linker shared-libraries linker-errors

如果您需要导出课程:

(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

0 个答案:

没有答案