首页 > 解决方案 > cmake 从对象库构建共享库会导致未定义的符号

问题描述

我正在使用 cmake 构建一个共享库。以下是我采取的步骤,从A_shared使用对象库构建共享库开始A_obj

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)

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

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

用gcc,B_shared是成功链接的。

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

标签: c++visual-c++cmakeg++shared-libraries

解决方案


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


推荐阅读