我有一个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
行,则会产生相同的结果。
答案 0 :(得分:2)
我已经能够通过将B和C的target_link_libraries
设置为私有来解决这个问题。这可能是也可能不是正确的解决方案,我将等待其他答案。如果我不这样做,似乎依赖性被带到最终的可执行文件(因此它链接到Top.dll和B.lib等)。