cmake 从对象库构建共享库导致未定义的符号

cmake building shared lib from object library results in undefined symbol

我正在使用 cmake 构建共享库。以下是我采取的步骤,首先使用对象库 A_obj.

构建共享库 A_shared
add_library(A_obj OBJECT ${A_SRCS})
add_library(A_shared SHARED)
target_link_libraries(A_shared PUBLIC A_obj)

这个过程有效。现在我希望构建另一个使用 A_shared 及其自己的资源的共享库。所以我有:

add_library(B_obj OBJECT ${B_SRCS})
target_link_libraries(B_obj PUBLIC A_shared)
add_library(B_shared SHARED)
target_link_libraries(B_shared PUBLIC B_obj)

在我看来这应该是有效的,因为我正在构建依赖于共享库 A_shared 的对象 B_obj,然后使用这些对象构建共享库 B_shared 并同时通过调用 target_link_libraries.

传递对 A_shared 的依赖

但是,这会导致在 MSVC 中构建时出现未定义的符号。当 linking B_shared.dll 时,我得到了对在 ${A_SRCS} 中定义并在 ${B_srcs} 中使用的全局变量的未解决的外部依赖性,而不是其他任何东西(如函数)。奇怪的是,目标文件 B_obj 编译正常。

使用 gcc,B_shared 成功 linked。

因此,我的问题是:我是否在 cmake 中做了正确的事情来实现我想要的?我想知道我误解了什么,因为我对此进行了广泛的研究,但我找不到我的过程中的错误,所以我将不胜感激任何澄清。

这通常来自 Windows 上共享库的行为:参见 。我必须手动导出符号。与对象库的交互没有产生问题。