You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过CMake将文本文件转为C++原始字符串字面量

用CMake将文本文件转换为C++原始字符串字面量

实现方案

方案1:自定义CMake函数生成转换后的头文件

通过CMake的文件读写命令,将目标文本文件的内容包裹成C++原始字符串字面量,生成一个可被#include的头文件。

  1. 在CMakeLists.txt中定义处理函数:
# 函数功能:将输入文本文件转换为包含原始字符串字面量的头文件
# 参数:INPUT_FILE 源文本文件路径,OUTPUT_FILE 生成的头文件路径
function(create_raw_string_header INPUT_FILE OUTPUT_FILE)
    # 读取源文件全部内容
    file(READ "${INPUT_FILE}" FILE_CONTENT)
    # 用R"(...)"包裹内容,构造原始字符串
    set(RAW_STRING_LITERAL "R\"(${FILE_CONTENT})\"")
    # 将处理后的内容写入目标头文件
    file(WRITE "${OUTPUT_FILE}" "${RAW_STRING_LITERAL}")
endfunction()

# 调用函数,将myfile.txt转换为mydata_raw.h(生成到构建目录)
create_raw_string_header("myfile.txt" "${CMAKE_BINARY_DIR}/mydata_raw.h")
  1. 在C++代码中引用生成的头文件:
const char* mydata = 
#include "mydata_raw.h"
;

注意:需要在CMake中把构建目录添加到include路径,比如include_directories(${CMAKE_BINARY_DIR})。

方案2:通过模板文件生成完整代码

如果不想额外生成头文件,可以用CMake的configure_file功能,基于模板生成包含原始字符串的C++源文件。

  1. 创建模板文件template.cpp.in:
const char* mydata = @RAW_DATA@;
  1. 在CMakeLists.txt中添加处理逻辑:
# 读取源文本文件内容
file(READ "myfile.txt" FILE_CONTENT)
# 构造原始字符串字面量
set(RAW_DATA "R\"(${FILE_CONTENT})\"")

# 基于模板生成最终的C++源文件
configure_file(
    "template.cpp.in"
    "${CMAKE_BINARY_DIR}/generated_data.cpp"
    @ONLY
)

CMake会自动将模板中的@RAW_DATA@替换为处理后的原始字符串,生成可直接编译的源文件。

特殊情况处理

如果源文本文件中包含)"序列,会破坏默认原始字符串的结束标记。此时需要自定义分隔符避免冲突:

修改CMake函数,添加分隔符参数:

function(create_raw_string_header INPUT_FILE OUTPUT_FILE DELIMITER)
    file(READ "${INPUT_FILE}" FILE_CONTENT)
    # 使用自定义分隔符构造原始字符串,格式为R"delim(内容)delim"
    set(RAW_STRING_LITERAL "R\"${DELIMITER}(${FILE_CONTENT})${DELIMITER}\"")
    file(WRITE "${OUTPUT_FILE}" "${RAW_STRING_LITERAL}")
endfunction()

# 调用时传入自定义分隔符(比如MY_UNIQUE_DELIM)
create_raw_string_header("myfile.txt" "${CMAKE_BINARY_DIR}/mydata_raw.h" "MY_UNIQUE_DELIM")

生成的原始字符串会变为R"MY_UNIQUE_DELIM(long content to be included)MY_UNIQUE_DELIM",避免与文件内容冲突。

内容的提问来源于stack exchange,提问作者Sy Tran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 20:58:12