将共享库 (Foo) 与另一个内部静态库 (Bar) 链接时,我们遇到了一个奇怪的问题。Bot 库构建在同一台机器上的同一 CMake 构建目录中。
很明显,共享库中的代码必须与位置无关,因此我们在任何静态库依赖项上设置 PIC,如下所示:
set_property(TARGET Bar PROPERTY POSITION_INDEPENDENT_CODE True)
我们以常规方式链接库,使用target_link_libraries(Foo PUBLIC Bar)
.
这适用于 GCC 4.8、ld 2.22 和 CMake 3.10.1。
但是,由于某种原因,使用 GCC 7、ld 2.29.1 和 CMake 3.10.2 链接失败undefined reference
,Bar 中的不同函数出现多个错误。函数在 Bar 中定义和实现,使用 Foo 并且整个东西用 GCC4.8 编译。那么给了什么?
我们也知道双重 ABI 情况和std::string
. (请参阅https://stackoverflow.com/a/49119902/2095190)但是错误不符合模式。
我有一些想法,尽管他们都没有解释为什么它可以与旧工具链一起使用:
- 可能链接器选项的顺序是一个问题?
- 缺少传递依赖?(请参阅答案:使用 CMake 与其他静态库链接的静态库 - 一个有效,一个无效。为什么?)
我们的项目比较复杂,下周我会尝试隔离错误。