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

Inq*_*ive 7 c++ linker g++ cmake

是否可以使用 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到该变量中包含的所有库。)

Tsy*_*rev 8

CMake 3.24 引入了LINK_GROUP生成器表达式,它允许在命令中对库进行分组target_link_libraries,以便在该组上添加一些功能。该组功能之一是 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
)
Run Code Online (Sandbox Code Playgroud)