如何在CMake中借助rustc输出为二进制文件追加target triple?
问题根源与解决办法
你的问题大概率是从rustc -Vv提取的RUST_TARGET_TRIPLE变量中包含了隐藏的空白字符(换行、制表符或首尾空格),这些字符会被CMake当作文件名的一部分,而Windows系统下文件名不允许包含换行等特殊字符,因此触发路径非法错误。硬编码时你输入的是干净的字符串,自然不会有问题。
解决步骤
1. 修正CMake中提取target triple的逻辑,确保变量无空白
在获取RUST_TARGET_TRIPLE后,必须显式去除所有前后空白字符,同时优化正则匹配以兼容host:后可能存在的多空格情况:
# 获取rustc详细版本输出,自动去除末尾换行 execute_process( COMMAND rustc -Vv OUTPUT_VARIABLE RUSTC_VV_OUTPUT ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE ) # 提取target triple,匹配host:后任意数量的空格 string(REGEX MATCH "host: *([^\n]+)" _ ${RUSTC_VV_OUTPUT}) set(RUST_TARGET_TRIPLE "${CMAKE_MATCH_1}") # 强制去除变量前后所有空白(换行、空格、制表符等) string(STRIP "${RUST_TARGET_TRIPLE}" RUST_TARGET_TRIPLE) # 设置目标二进制的输出名称 set_target_properties(your_sidecar_target PROPERTIES OUTPUT_NAME "your_exe_name-${RUST_TARGET_TRIPLE}" )
2. 验证变量内容(可选但推荐)
在CMake代码中添加调试输出,确认RUST_TARGET_TRIPLE的实际内容:
message(STATUS "Extracted target triple: '${RUST_TARGET_TRIPLE}'")
如果输出中引号内包含换行(比如'x86_64-pc-windows-msvc\n')或多余空格,说明之前的空白处理不到位,需进一步调整。
为什么硬编码可行?
硬编码的target triple是纯字符串,没有任何隐藏的特殊字符,而从rustc -Vv输出提取时,正则匹配可能会捕获到换行符,或者host:字段前后的空格,这些字符在Windows文件名中是非法的,从而导致构建失败。
内容的提问来源于stack exchange,提问作者MHebes
相关产品推荐
相关产品推荐

