我有一个类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
答案 0 :(得分:2)
除非为它们编写定义,否则您不会在基类中看到纯虚函数的任何符号,因为编译器不可能为不存在的定义输出任何符号。
除非你调用它们,否则你也不会看到派生类中覆盖的任何定义,并且可能只有在你调用它们并且没有优化的情况下进行编译时。
这是因为它们被定义为内联函数(因为你在类体中定义它们),所以根据C ++标准中的[dcl.fct.spec] / 4,编译器知道那些函数的任何其他调用者其他目标文件也可以看到函数定义,因此在编译SortingAbsAlgorithm.cpp
时不需要发出外部符号。
如果要确保编译器输出这些函数的定义,则不要将它们定义为内联函数。或者,如果您在库中有构造SortingAbsAlgorithm
实例的代码,该代码也将确保库包含虚函数的符号(但不包含在库中未调用的任何其他内联函数) )。