将共享对象链接到其他共享对象C ++项目

时间:2015-09-30 15:56:37

标签: c++ linker cmake

我正在一个非常大的C ++项目中创建一个大的共享对象,我们使用的外部SDK有几个头文件和几个相互共享的共享库。这意味着SDK类的声明在头文件中,但它们的定义在共享对象中。

据我所知,由于头文件中的声明,我可以编译这段代码。

但我完全不明白的是什么时候必须明确指定链接器使用的共享对象?

即如果我指定它(例如在带有 target_link_libraries 命令的cmake中),则链接器可以检查符号是否在共享库中。但是如果我没有指定它会发生什么(即链接中没有任何-l [shared_object_name]标志)?我的经验是(令我感到惊讶)正常工作(即整个建筑过程完成)。怎么可能?

2 个答案:

答案 0 :(得分:3)

在POSIX共享库中,您可以在共享库中使用未定义的符号,并且所有符号都可以正常链接。只要可执行文件完全链接,就不会出现链接器错误。

这样做是因为动态库模仿了静态库的行为,静态库可能有未定义的符号(静态库没有链接,开头)。

如果你来自Windows背景,那么你会感到惊讶,因为Windows DLL不能有未定义的符号。

如果您对此感到担心,可以查看链接器选项--no-undefined--no-allow-shlib-undefined

答案 1 :(得分:2)

  

我的经验是(让我感到惊讶)工作正常(即整个建筑过程完成)。

这似乎不太可能。

事实上......

  

怎么可能?

不是。

唯一的解释是你没有使用这些库文件中定义的符号。它们要么位于第三方代码的标题部分,要么根本不属于第三方代码。

或者您正在构建自己的共享库。但最终的可执行文件仍然需要链接的第三方库。