cmake - 删除 CMake 链接器标志端组重复项
问题描述
我想在一个可执行文件中使用多个共享库,但是-Wl,--end-group
子静态库的链接器标志不知何故丢失了。以下是我的CMakeLists.txt
(可执行文件a
取决于b
和d
.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 ,那么编译会中止并报错,提示缺少关闭。)b
TARGET_LINK_LIBRARIES
-Wl,--end-group
-fuse-ld=gold
--end-group
问题
决赛-Wl,--end-group
怎么不见了?我怎样才能让它重新出现在正确的位置(最后,之后libc.a
)?
解决方案
我相信添加这样的链接器参数不是 CMake 惯用的方式。
您可以通过使用命令设置为 3+(所有目标默认为 2)来利用目标属性LINK_INTERFACE_MULTIPLICITYset_target_properties
。这指示 CMake 构造链接线,以便链接器将扫描依赖关系图的强连通分量至少与属性指定的次数一样多。
但是,我不确定您为什么需要--start/end-group
选项,因为您在上面似乎没有依赖循环CMakeLists.txt
。简单地为每个库设置依赖项target_link_libraries
应该可以工作。
推荐阅读
- javascript - CSS 定位 2 个 div - 滚动到较短的一个的末尾
- ssl - grpc中不安全的连接是什么意思?
- ios - 为什么设置 backgroundColor 对我的自定义 UIView 没有明显影响?
- python - Tkinter 不更新游标
- wordpress - AWS Wordpress HTTP 到 HTTPS 重定向不起作用
- python - 无法导入名称 _remove_dead_weakref
- pandas - 同时堆叠多组列
- amp-html - AMP:在 amp-list 中切换 CSS 类?
- google-bigquery - 用户在项目 gdelt-bq 中没有 bigquery.jobs.create 权限
- python - 发送参数时正则表达式不起作用