问题描述
我正在使用 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。我必须手动导出符号。与对象库的交互不会产生问题。