将共享库(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上可以正常使用。
但是,由于某些原因,对于Bar中的不同功能,对于GCC 7,ld 2.29.1和CMake 3.10.2,链接失败,并出现多个undefined reference
错误。这些功能是在Bar中定义和实现的,使用了Foo,整个内容都使用GCC4.8进行了编译。那有什么呢?
我们也意识到ABI的双重局面和std::string
的潜在问题。 (请参见https://stackoverflow.com/a/49119902/2095190。但是,该错误不适合该模式。
我有一些想法,尽管没有一个可以解释为什么它可以与较旧的工具链一起使用:
我们的项目相对复杂,下周我将尝试隔离该错误。