gpt4 book ai didi

windows - 为什么在 Windows 上的 CMake 中构建时会出现重复的符号链接(symbolic link)器错误?

转载 作者:可可西里 更新时间:2023-11-01 11:47:39 25 4
gpt4 key购买 nike

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

现在,当我尝试通过 CMake 将可执行文件与 Top.dll 链接时,我得到每个公共(public)符号的链接器错误,声称它在两个地方定义(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 行,结果相同。

最佳答案

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

关于windows - 为什么在 Windows 上的 CMake 中构建时会出现重复的符号链接(symbolic link)器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40594066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com