如何通过CMake将文本文件转为C++原始字符串字面量
用CMake将文本文件转换为C++原始字符串字面量
实现方案
方案1:自定义CMake函数生成转换后的头文件
通过CMake的文件读写命令,将目标文本文件的内容包裹成C++原始字符串字面量,生成一个可被#include的头文件。
- 在
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")
- 在C++代码中引用生成的头文件:
const char* mydata = #include "mydata_raw.h" ;
注意:需要在CMake中把构建目录添加到include路径,比如include_directories(${CMAKE_BINARY_DIR})。
方案2:通过模板文件生成完整代码
如果不想额外生成头文件,可以用CMake的configure_file功能,基于模板生成包含原始字符串的C++源文件。
- 创建模板文件
template.cpp.in:
const char* mydata = @RAW_DATA@;
- 在
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
相关产品推荐
相关产品推荐

