微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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,然后使用这些对象构建共享库 {{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 中做了正确的事情来实现我想要的吗?我想知道我的误解是什么,因为我已经对此进行了广泛的研究,但我找不到我的过程中的错误,所以我非常感谢您的澄清。

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。