C++ 已实现父方法的共享库中没有符号
我有一个类C++ 已实现父方法的共享库中没有符号,c++,linker,shared-libraries,static-libraries,C++,Linker,Shared Libraries,Static Libraries,我有一个类AbsAlgorithm,它有3个虚拟方法: class AbsAlgorithm { public: //..... other methods virtual void run() = 0; virtual bool init(TestCase&) = 0; virtual bool done() = 0; }; 我创建了一个静态库,libAlgatorc.a,其中包含这个类 我还有一个类SortingAbsAlgorithm,它继承了Ab
AbsAlgorithm
,它有3个虚拟方法:
class AbsAlgorithm
{
public:
//..... other methods
virtual void run() = 0;
virtual bool init(TestCase&) = 0;
virtual bool done() = 0;
};
我创建了一个静态库,libAlgatorc.a
,其中包含这个类
我还有一个类SortingAbsAlgorithm
,它继承了AbsAlgorithm
,并重写了run
、init
和done
方法
class SortingAbsAlgorithm : public AbsAlgorithm
{
public:
void run()
{
execute(...);
}
bool done()
{
return result;
}
}
当我创建包含此类(以及其他一些类)的共享库时,共享库中没有用于SortingAbsAlgorithm::run
、SortingAbsAlgorithm::init
和SortingAbsAlgorithm::done
的符号。为什么?
我创建的共享库如下所示:
g++ -std=gnu++11 -fPIC SortingAbsAlgorithm.cpp SortingTestSetIterator.cpp SortingTestCase.cpp -shared -o libProject.so -Wl,--whole-archive -lAlgatorc -Wl,--no-whole-archive
除非为基类编写定义,否则在基类中不会看到纯虚函数的任何符号,因为编译器不可能为不存在的定义输出任何符号 在派生类中,您也不会看到覆盖的任何定义,除非您调用它们,而且可能只有在您调用它们并在没有优化的情况下编译时才会看到
这是因为它们被定义为内联函数(因为您在类体中定义了它们),因此根据C++标准中的[DCL .fCT.SPEC]/4,编译器知道其他对象文件中的那些函数的任何其他调用方也可以看到函数定义,因此,在编译
SortingAbsAlgorithm.cpp
时,不需要发出外部符号
如果要确保编译器输出这些函数的定义,则不要将它们定义为内联函数。或者,如果库中的代码构造了
SortingAbsAlgorithm
的实例,该实例还将确保库中包含虚拟函数的符号(但不包含库中未调用的任何其他内联函数)。是否定义了这些纯虚拟函数?如果它们只是声明的,而不是定义的,那么库中可能会输出什么?或者您是在询问排序算法
中的覆盖?(不清楚您询问的是哪些符号)。即使在编辑之后,仍然不清楚您询问的是哪些符号。您是否希望看到AbsAlgorithm::run
、或SortingAbsAlgorithm::run
、或两者的符号?我希望看到SortingAbsAlgorithm::run。我假设不会有任何AbsAlgorithm::run symbolOK,那么你的问题是矛盾的,因为你说“这是因为这些方法是纯虚拟方法吗?”而SortingAbsAlgorithm::run
不是纯虚拟方法。我删除了那句话。SortingAbsAlgorithm::run符号不在我的共享库中可能会有什么错误?所以基本上我可以调用它们,但在共享库中看不到它们。如果我在我的主程序中加载这个动态库并创建SortingAbsAlgorithm类的实例,我可以调用run、done和init方法?这是否正确?如果主程序看到SortingAbsAlgorithm
的定义,那么它将能够调用它们,因为函数是内联定义的,并且主程序可以看到它们的定义。如果主程序可以创建类的实例,那么它必须能够看到它的定义,这样它也可以看到函数。