已实现父方法的共享库中没有符号
No symbol in shared library of implemented parent method
我有一个类AbsAlgorithm
,它有三个虚拟方法:
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
除非为纯虚函数编写定义,否则在基类中看不到任何符号,因为编译器不可能为不存在的定义输出任何符号。
你也不会在派生类中看到任何重写的定义,除非你调用它们,而且可能只有当你调用它们并且编译时没有优化。
这是因为它们被定义为内联函数(因为您在类体中定义了它们),因此根据[dcl. fact]。在c++标准中,编译器知道其他目标文件中这些函数的任何其他调用者也可以看到这些函数的定义,因此在编译SortingAbsAlgorithm.cpp
时不需要发出外部符号。
如果你想确保编译器输出这些函数的定义,那么不要将它们定义为内联函数。或者,如果库中的代码构造了一个SortingAbsAlgorithm
的实例,它也将确保库中包含虚函数的符号(但不包含库中未调用的任何其他内联函数的符号)。
相关文章:
- 为什么我的共享库中存在展开符号
- 仅在少数方法(静态或共享库)中解析的外部符号
- 共享对象、符号、C/C++ 库链接和加载
- 共享对象中的符号
- 如何防止 CMake 在构建时(而不是在安装时)为共享库创建符号链接?
- 使用共享库编译可执行文件时仅链接所需的符号
- 为什么 std:: 符号在共享库中被强制导出?
- 使用 C++ 标准库避免共享库中的符号冲突
- 隐藏共享库中的"_init"和"_fini"符号
- 共享对象中的符号名称与文件中.cpp函数不同
- C++:在共享对象中调用抽象基类构造函数/未定义的符号
- 共享库中使用"使用命名空间"定义的符号错误
- GCC 中使用 -O3 的共享库编译不会导出与 -O0 中那样多的符号
- Cython:共享对象中未定义的符号
- 不同的数学符号绑定与共享库与 dlopen 并直接链接到可执行文件 (Linux)
- 尝试与从 CUDA 对象构建的共享库链接时未定义的符号
- 在链接链接静态(GSOAP)库的共享库时,为什么会得到一个未定义的符号
- 共享库中非模板基的模板子类导致未定义的符号类型信息'class'链接错误
- 静态库将转换为共享的lib符号隐藏
- 在共享C++库中加载共享库时C++未定义的符号,该库本身由 Python 加载