已实现父方法的共享库中没有符号

No symbol in shared library of implemented parent method

本文关键字:符号 共享 实现 方法      更新时间:2023-10-16

我有一个类AbsAlgorithm,它有三个虚拟方法:

class AbsAlgorithm
{
public:
    //..... other methods
    virtual void run() = 0;
    virtual bool init(TestCase&) = 0;
    virtual bool done() = 0;
};

我已经创建了一个包含这个类的静态库libAlgatorc.a

我也有类SortingAbsAlgorithm,继承自AbsAlgorithm和覆盖run, initdone的方法。

class SortingAbsAlgorithm : public AbsAlgorithm
{
public:
    void run()
    {
        execute(...);
    }
    bool done()
    {
        return result;
    }
}

当我创建一个包含这个类(和其他一些类)的共享库时,我在共享库中没有SortingAbsAlgorithm::run, SortingAbsAlgorithm::initSortingAbsAlgorithm::done的符号。为什么?

我这样创建共享库:

g++ -std=gnu++11 -fPIC SortingAbsAlgorithm.cpp SortingTestSetIterator.cpp SortingTestCase.cpp  -shared -o libProject.so -Wl,--whole-archive -lAlgatorc -Wl,--no-whole-archive

除非为纯虚函数编写定义,否则在基类中看不到任何符号,因为编译器不可能为不存在的定义输出任何符号。

你也不会在派生类中看到任何重写的定义,除非你调用它们,而且可能只有当你调用它们并且编译时没有优化。

这是因为它们被定义为内联函数(因为您在类体中定义了它们),因此根据[dcl. fact]。在c++标准中,编译器知道其他目标文件中这些函数的任何其他调用者也可以看到这些函数的定义,因此在编译SortingAbsAlgorithm.cpp时不需要发出外部符号。

如果你想确保编译器输出这些函数的定义,那么不要将它们定义为内联函数。或者,如果库中的代码构造了一个SortingAbsAlgorithm的实例,它也将确保库中包含虚函数的符号(但不包含库中未调用的任何其他内联函数的符号)。