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

Linking a shared object into other shared object C++ project

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

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

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

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

My experience is (which surprised me) that is work properly (i.e. the whole building process finished).

这似乎不太可能。

事实上……

How can it possible?

不是。

唯一的解释是您没有使用那些库文件中定义的符号。它们要么在 third-party 代码的 header-only 部分,要么根本不在 third-party 代码中。

或者您正在构建自己的共享库。不过,最终的可执行文件仍需要链接的 third-party 库。

在 POSIX 共享库中,您可以在共享库中有未定义的符号,所有这些都会 link 就好了。只要可执行文件完全 linked,就不会有 linker 错误。

这样做是因为动态库模仿静态库的行为,而静态库可以有未定义的符号(静态库不是 linked,首先)。

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

如果你担心这个,你可以检查linker选项--no-undefined--no-allow-shlib-undefined