如何在CMake中无需手动编写参数,为目标库添加--start-group/--end-group
在CMake中自动将链接库包裹进--start-group/--end-group
可以直接使用CMake 3.12及以上版本提供的$<LINK_GROUP:...>生成器表达式实现需求,完全不需要手动处理target_link_options或给库添加-l前缀。
核心用法
把需要放入组内的库列表,用$<LINK_GROUP:--start-group,库列表,--end-group>包裹后直接传入target_link_libraries即可。CMake会自动处理库的格式转换,且仅在支持该选项的编译器(如GCC/g++)上生效,兼容性良好。
示例代码
假设你原本的链接命令是:
target_link_libraries(myTarget mylibrary1 mylibrary2 ${MY_VARIABLE_LIST_OF_LIBRARIES})
修改为分组链接的版本:
# 可选:先把需要分组的库统一存到变量里,结构更清晰 set(GROUPED_LIBRARIES mylibrary1 mylibrary2 ${MY_VARIABLE_LIST_OF_LIBRARIES} ) # 用生成器表达式包裹分组库 target_link_libraries(myTarget PRIVATE $<LINK_GROUP:--start-group,${GROUPED_LIBRARIES},--end-group> )
如果还有不需要分组的库,可以分开声明:
target_link_libraries(myTarget PRIVATE standalone_library # 无需重复搜索的独立库 $<LINK_GROUP:--start-group,${GROUPED_LIBRARIES},--end-group> )
低版本兼容方案
如果你的CMake版本低于3.12,只能手动构造链接选项,但需注意该方式会强制传递选项,对不支持的编译器可能产生警告:
target_link_libraries(myTarget PRIVATE -Wl,--start-group ${GROUPED_LIBRARIES} -Wl,--end-group )
内容的提问来源于stack exchange,提问作者Inquisitive
相关产品推荐
相关产品推荐

