如何让CMake的<LINK_LIBRARIES>在链接命令中用逗号而非空格分隔?
解决CMake自定义链接器库参数格式问题
方法一:使用CMake生成表达式(CMake 3.12+)
修改工具链文件中的CMAKE_C_LINK_EXECUTABLE配置,利用$<JOIN>生成表达式将空格分隔的库列表转换为逗号分隔:
set(CMAKE_C_LINK_EXECUTABLE "${LINKER} <OBJECTS> -library=$<JOIN:<LINK_LIBRARIES>,> <LINK_FLAGS> -output=<TARGET>")
$<JOIN:<LINK_LIBRARIES>,>会自动将<LINK_LIBRARIES>占位符替换后的空格分隔库列表,转换为逗号连接的格式,同时消除-library=与第一个库之间的空格,最终生成的链接参数就是-library=example1.lib,example2.lib。
方法二:手动字符串替换(兼容低版本CMake)
如果你的CMake版本低于3.12,不支持$<JOIN>生成表达式,可以在工具链文件中通过字符串替换处理链接库:
# 针对每个目标生成链接命令时,替换库列表的空格为逗号 set(CMAKE_C_LINK_EXECUTABLE "${LINKER} <OBJECTS> \"-library=$(subst ,,${LINK_LIBRARIES})\" <LINK_FLAGS> -output=<TARGET>")
或者使用CMake的string(REPLACE)命令在配置阶段处理全局固定库列表:
# 先转换全局标准库列表的格式 string(REPLACE " " "," _transformed_libs "${CMAKE_C_STANDARD_LIBRARIES}") # 设置链接命令 set(CMAKE_C_LINK_EXECUTABLE "${LINKER} <OBJECTS> -library=${_transformed_libs} <LINK_FLAGS> -output=<TARGET>")
注意:手动替换方式更适合全局固定库列表的场景,若每个目标的链接库不同,优先使用生成表达式方法。
验证
修改工具链文件后,重新运行cmake ..生成构建文件,查看链接命令是否已变为预期的-library=example1.lib,example2.lib格式。
内容的提问来源于stack exchange,提问作者Corey
相关产品推荐
相关产品推荐

