如何在 CMake 中使用 `--start-group` 和 `--end-group`

问题描述 投票:0回答:2

是否可以使用 CMake 将目标的库包含在

--start-group
/
--end-group
中,而无需手动将参数字符串写入
target_link_options

背景:将 C++ 可执行文件链接到库列表时(使用 g++ 7.5.0),我遇到了 库排序问题。我最近了解到 gcc/g++ 中的

--start-group
--end-group
选项
允许重复搜索档案。我想在使用 CMake 生成构建文件时启用这些选项。

给定目标库名称列表(例如

target_link_libraries(myTarget mylibrary1 mylibrary2 ${MY_VARIABLE_LIST_OF_LIBRARIES} ...)
),是否可以将所有这些库包含在
--start-group
/
--end-group
中,而无需像
target_link_options(myTarget PUBLIC "--start-group -lmylibrary1 -lmylibrary2 ... --end-group")
中那样手动输入参数? (我特别希望避免追踪
${MY_VARIABLE_LIST_OF_LIBRARIES}"
的内容来手动将
-l
添加到该变量中包含的所有库。)

c++ cmake linker g++
2个回答
8
投票

CMake 3.24 引入了 LINK_GROUP 生成器表达式,它允许在

target_link_libraries
命令中对库进行分组,以便在该组上添加一些 feature。该组功能之一是 RESCAN,它有效地为 GNU 编译器添加
--start-group
/
--end-group

target_link_libraries(myTarget
  PRIVATE # or any other keyword
  mylibrary1 mylibrary2 # These libraries will be linked normally
  "$<LINK_GROUP:RESCAN,${MY_VARIABLE_LIST_OF_LIBRARIES}>" # These libraries will be grouped
)

0
投票

我发现了这个帖子,但该解决方案对我来说并不真正有效。如果这可以帮助其他人,则可以采用不同的方法。参考:https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_LINK_GROUP_USING_FEATURE.html#variable:CMAKE_%3CLANG%3E_LINK_GROUP_USING_%3CFEATURE%3E

set(CMAKE_CXX_LINK_GROUP_USING_cross_refs_SUPPORTED TRUE)
set(CMAKE_CXX_LINK_GROUP_USING_cross_refs
  "LINKER:--start-group"
  "LINKER:--end-group"
)
target_link_libraries(
  myTarget
  "$<LINK_GROUP:cross_refs,your_lib1, external_lib>"
)
© www.soinside.com 2019 - 2024. All rights reserved.