【发布时间】:2022-01-05 23:02:06
【问题描述】:
序言: 一些不太好的做法和过时的软件加剧了这个问题。这是企业,短期内我无能为力。
我正在使用 Cmake 2.8 并尝试在以下配置中链接一些库:
root CMakeLists.txt:
add_subdirectory(dir_a)
add_subdirectory(dir_b)
add_subdirectory(dir_tests)
set(myLibs A B)
set(thirdPartyLibs C D E) #link_directories and such already set elsewhere
add_library(AB SHARED)
target_link_libraries(
AB
"-Wl,--whole-archive"
myLibs
"-Wl,--no-whole-archive"
thirdPartyLibs)
dir_a CMakeLists.txt:
add_library(A STATIC <sources for a>)
dir_b CMakeLists.txt:
add_library(B STATIC <sources for B>)
dir_tests CMakeLists.txt:
add_executable(Z zsource.cpp)
target_link_libraries(Z AB) #AB is the shared object
add_test(Z Z)
当我查看 Z 的链接器输入(在 CMakeFiles 目录中)时,它正在执行以下操作:
... c++ <flags> ... zsource.o -o Z <link directories> -rdynamic libAB.so -Wl--whole-archive libA.a libB.a -Wl,--no-whole-archive <third party libs>
问题在于静态库libA.a 和libB.a 包含全局变量。检查这些全局变量的唯一性,如果发现全局变量重复,则判断为严重问题。当链接Z 时,会发生这种情况。我怀疑包含 libAB.so、libA.a 和 libB.a 会复制全局变量。
如何避免这种行为?我尝试为 AB 和 Z 将 PUBLIC、PRIVATE、INTERFACE 的各种组合添加到 target_link_libraries,但它没有达到我想要的效果 - 要么存在相同的错误,要么符号无法解析。
【问题讨论】:
-
PRIVATE应该可以工作,请向minimal reproducible example 显示您尝试过的内容以及遇到的错误