首页 > 解决方案 > 删除 CMake 链接器标志端组重复项

问题描述

我想在一个可执行文件中使用多个共享库,但是-Wl,--end-group子静态库的链接器标志不知何故丢失了。以下是我的CMakeLists.txt(可执行文件a取决于bd.b本身取决于c):

CMAKE_MINIMUM_REQUIRED(VERSION 2.8.12)
PROJECT(ORDER_TEST CXX C)

#######
#  a  #
#######
ADD_EXECUTABLE(a a/a.cpp a/inc/a.h)

TARGET_INCLUDE_DIRECTORIES(a PUBLIC a/inc)

TARGET_LINK_LIBRARIES(a PRIVATE
    "-Wl,--no-whole-archive"
    "-Wl,--start-group"
    d
    b
    "-Wl,--end-group"
)

#######
#  b  #
#######
ADD_LIBRARY(b STATIC b/b.cpp b/inc/b.h)

TARGET_INCLUDE_DIRECTORIES(b PUBLIC b/inc)

TARGET_LINK_LIBRARIES(b PUBLIC
    "-Wl,--no-whole-archive"
    "-Wl,--start-group"
    c
    "-Wl,--end-group"
)

#######
#  c  #
#######
ADD_LIBRARY(c STATIC c/c.cpp c/inc/c.h)

TARGET_INCLUDE_DIRECTORIES(c PUBLIC c/inc)

#######
#  d  #
#######
ADD_LIBRARY(d STATIC d/d.cpp d/inc/d.h)

TARGET_INCLUDE_DIRECTORIES(d PUBLIC d/inc)

现在,最终的链接器命令(取自 link.txt,重新格式化)是:

/usr/bin/c++ \
    CMakeFiles/a.dir/a/a.cpp.o \
    -o a \
    -rdynamic \
    -Wl,--no-whole-archive \
    -Wl,--start-group \
    libd.a \
    libb.a \
    -Wl,--end-group \
    -Wl,--no-whole-archive \
    -Wl,--start-group \
    libc.a

决赛-Wl,--end-group不见了。为了检查 CMake 是否可能只是丢失了最后一个参数,我在 's 的末尾添加了一些任意参数-Wl,-s(视线。(如果我还使用了 flag ,那么编译会中止并报错,提示缺少关闭。)bTARGET_LINK_LIBRARIES-Wl,--end-group-fuse-ld=gold--end-group

问题

决赛-Wl,--end-group怎么不见了?我怎样才能让它重新出现在正确的位置(最后,之后libc.a)?

标签: cmake

解决方案


我相信添加这样的链接器参数不是 CMake 惯用的方式。

您可以通过使用命令设置为 3+(所有目标默认为 2)来利用目标属性LINK_INTERFACE_MULTIPLICITYset_target_properties。这指示 CMake 构造链接线,以便链接器将扫描依赖关系图的强连通分量至少与属性指定的次数一样多。

但是,我不确定您为什么需要--start/end-group选项,因为您在上面似乎没有依赖循环CMakeLists.txt。简单地为每个库设置依赖项target_link_libraries应该可以工作。


推荐阅读