是否可以使用 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
添加到该变量中包含的所有库。)
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
)
我发现了这个帖子,但该解决方案对我来说并不真正有效。如果这可以帮助其他人,则可以采用不同的方法。参考: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>"
)