【问题标题】:Cmake "expanding" (?) shared library, duplicate linking issueCmake“扩展”(?)共享库,重复链接问题
【发布时间】: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.alibB.a 包含全局变量。检查这些全局变量的唯一性,如果发现全局变量重复,则判断为严重问题。当链接Z 时,会发生这种情况。我怀疑包含 libAB.solibA.alibB.a 会复制全局变量。

如何避免这种行为?我尝试为 AB 和 Z 将 PUBLIC、PRIVATE、INTERFACE 的各种组合添加到 target_link_libraries,但它没有达到我想要的效果 - 要么存在相同的错误,要么符号无法解析。

【问题讨论】:

标签: c++ cmake


【解决方案1】:

使用 target_link_optionsSHELL: 前缀,请参阅文档。

target_link_options(
  "SHELL:-Wl,--whole-archive $<TARGET_FILE:A> $<TARGET_FILE:B> -Wl,--no-whole-archive"
)

我喜欢:

add_library(A ...)
target_link_options(A INTERFACE
   "SHELL:-Wl,--whole-archive $<TARGET_FILE:A> -Wl,--no-whole-archive"
)
add_library(B ...)
target_link_options(B INTERFACE
   "SHELL:-Wl,--whole-archive $<TARGET_FILE:B> -Wl,--no-whole-archive"
)

target_link_libraries(exe PUBLIC A B)  # just works

* 我认为最好使用$&lt;SHELL_PATH:$&lt;TARGET_FILE:A&gt;&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多