cmake 从对象库构建共享库导致未定义的符号
cmake building shared lib from object library results in undefined symbol
我正在使用 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)
在我看来这应该是有效的,因为我正在构建依赖于共享库 A_shared
的对象 B_obj
,然后使用这些对象构建共享库 B_shared
并同时通过调用 target_link_libraries
.
传递对 A_shared
的依赖
但是,这会导致在 MSVC 中构建时出现未定义的符号。当 linking B_shared.dll
时,我得到了对在 ${A_SRCS}
中定义并在 ${B_srcs}
中使用的全局变量的未解决的外部依赖性,而不是其他任何东西(如函数)。奇怪的是,目标文件 B_obj
编译正常。
- 如果我将 link
B_shared
改为 A_obj
,它工作正常。但这给我的印象是 B_shared
实际上将包含来自 A_obj
的目标文件,但我只希望它 link 到 A_shared
.
- 如果我 link
B_obj
到 A_obj
,什么都没有改变,我仍然得到未解决的依赖关系。
使用 gcc,B_shared
成功 linked。
因此,我的问题是:我是否在 cmake 中做了正确的事情来实现我想要的?我想知道我误解了什么,因为我对此进行了广泛的研究,但我找不到我的过程中的错误,所以我将不胜感激任何澄清。
这通常来自 Windows 上共享库的行为:参见 。我必须手动导出符号。与对象库的交互没有产生问题。
我正在使用 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)
在我看来这应该是有效的,因为我正在构建依赖于共享库 A_shared
的对象 B_obj
,然后使用这些对象构建共享库 B_shared
并同时通过调用 target_link_libraries
.
A_shared
的依赖
但是,这会导致在 MSVC 中构建时出现未定义的符号。当 linking B_shared.dll
时,我得到了对在 ${A_SRCS}
中定义并在 ${B_srcs}
中使用的全局变量的未解决的外部依赖性,而不是其他任何东西(如函数)。奇怪的是,目标文件 B_obj
编译正常。
- 如果我将 link
B_shared
改为A_obj
,它工作正常。但这给我的印象是B_shared
实际上将包含来自A_obj
的目标文件,但我只希望它 link 到A_shared
. - 如果我 link
B_obj
到A_obj
,什么都没有改变,我仍然得到未解决的依赖关系。
使用 gcc,B_shared
成功 linked。
因此,我的问题是:我是否在 cmake 中做了正确的事情来实现我想要的?我想知道我误解了什么,因为我对此进行了广泛的研究,但我找不到我的过程中的错误,所以我将不胜感激任何澄清。
这通常来自 Windows 上共享库的行为:参见