【发布时间】:2021-07-08 10:56:22
【问题描述】:
我正在使用 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)
在我看来这应该是有效的,因为我正在构建对象B_obj,它依赖于共享库A_shared,然后使用这些对象构建共享库B_shared,同时使用对target_link_libraries 的调用传递对A_shared 的依赖。
但是,这会导致在 MSVC 中构建时出现未定义的符号。链接B_shared.dll 时,我得到了对在${A_SRCS} 中定义并在${B_srcs} 中使用的全局变量的未解决的外部依赖关系,而不是其他任何东西(如函数)。奇怪的是,目标文件B_obj 编译正常。
- 如果我将
B_shared链接到A_obj,它工作正常。但这给我的印象是B_shared实际上将包含来自A_obj的目标文件,但我只希望它链接到A_shared。 - 如果我将
B_obj链接到A_obj,没有任何变化,我仍然得到未解决的依赖关系。
使用 gcc,B_shared 链接成功。
因此,我的问题是:我是否在 cmake 中做正确的事情来实现我想要的?我想知道我误解了什么,因为我已经对此进行了广泛的研究,但我找不到我的过程中的错误,所以我非常感谢任何澄清。
【问题讨论】:
-
问题实际上来自这里提出的问题:stackoverflow.com/questions/54560832/… 尽管我正在写
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE),但这不适用于全局变量。我必须手动导出它们。
标签: c++ visual-c++ cmake g++ shared-libraries