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

时间:2021-04-13 11:27:55

标签: c++ visual-c++ cmake g++ shared-libraries

我正在使用 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,然后使用这些对象构建共享库 {{1}并同时使用对 B_shared 的调用传递对 A_shared 的依赖。

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

  • 如果我改为将 B_obj 链接到 B_shared,它可以正常工作。但这给我的印象是 A_obj 实际上将包含来自 B_shared 的目标文件,但我只希望它链接到 A_obj
  • 如果我将 A_shared 链接到 B_obj,没有任何变化,我仍然得到未解决的依赖项。

使用 gcc,A_obj 已成功链接。

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

1 个答案:

答案 0 :(得分:0)

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

相关问题