在Windows上构建CMake时,为什么会出现重复的符号链接器错误?

时间:2016-11-14 17:02:54

标签: windows build cmake

我有一个CMake设置将4个静态库和1个共享库连接到一个顶级共享库(让我们称之为Top.dll)。除了一件事,这将工作正常。我有一个模块定义文件,表示哪些符号应该是公共的。 Top.dll构建,到目前为止一直很好。

现在当我尝试通过CMake将可执行文件与Top.dll链接时,我发现每个公共符号的链接器错误声称它在两个地方定义(Top.dll和实际定义它的静态库),即使Top .dll不包含自己的原始定义。如果我删除静态库然后按预期我得到未解决的符号错误。如果我删除模块定义文件,我会得到相同的。看起来好像是零次或两次。我在这里缺少一些设置吗?我不认为我是以非基本的方式使用CMake ......

更新通过CMake解释

# setup the lib
add_subdirectory(vendor/A) #shared library
add_subdirectory(vendor/B) #static library
add_subdirectory(vendor/C) #static library
add_library(Top SHARED ${ALL_SRC_FILES})
target_link_libraries(Top A B C)
set_target_properties(Top PROPERTIES LINK_FLAGS
          "/def:${PROJECT_SOURCE_DIR}/definitions.def") #contains symbols from B

add_subdirectory(C/Tests)

# CMakeLists.txt from C/Tests

add_executable(Tests ${SRC_FILES})
target_link_libraries(Tests Top)

以上是简化的,但是我会在编译C / tests项目时遇到如下错误:

B.lib(xxx.obj) : error LNK2005: _ABC already defined in Top.lib(Top.dll)

如果我从target_link_libraries调用中删除B.lib,那么我会得到未解析的符号。如果我删除/def行,则会产生相同的结果。

1 个答案:

答案 0 :(得分:2)

我已经能够通过将B和C的target_link_libraries设置为私有来解决这个问题。这可能是也可能不是正确的解决方案,我将等待其他答案。如果我不这样做,似乎依赖性被带到最终的可执行文件(因此它链接到Top.dll和B.lib等)。