Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.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++ 导出C+中的基类符号+;_C++_Linux_Linker_Shared Libraries_Linker Errors - Fatal编程技术网

C++ 导出C+中的基类符号+;

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()

如果需要导出类:

(1) 如果是类继承(带有“virtual”),您必须将“PUBLIC”添加到“classx”定义中吗

(2) 在“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)

注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