CMakeLists.txt中能否引用额外.txt文件?求类似LaTeX \input的实现方法
在CMakeLists.txt中引用外部文本文件的方法
当然可以!CMake提供了几种实用的方式来实现类似LaTeX \input的功能,把外部.txt文件的内容引入到你的构建配置中。根据你的需求(是引入CMake代码还是普通文本),可以选择下面的方法:
1. 直接引入并执行外部文件中的CMake代码(最接近\input)
如果你的.txt文件里写的是可执行的CMake代码(比如目标定义、编译选项配置等),CMake的include()命令完全可以胜任——它并不强制要求文件后缀是.cmake,你直接指定你的.txt文件路径即可,文件里的代码会像直接写在当前CMakeLists.txt中一样执行。
举个例子:
假设你有一个build_config.txt文件,内容是:
add_executable(MyProject main.cpp utils.cpp) target_compile_features(MyProject PRIVATE cxx_std_17)
在你的主CMakeLists.txt里,只需要添加一行:
include("${CMAKE_CURRENT_SOURCE_DIR}/build_config.txt")
这样CMake就会自动读取并执行build_config.txt里的所有代码,和你把这些代码直接粘贴到CMakeLists.txt里效果完全一致。
2. 读取外部文本内容到变量(灵活处理普通文本或代码)
如果你的.txt文件是普通文本,或者你需要先对读取到的内容做一些处理再使用,可以用file(READ)命令把文件内容读取到一个CMake变量中,之后按需使用:
示例1:读取普通文本用于输出或生成文件
# 读取README.txt的内容到变量 file(READ "${CMAKE_CURRENT_SOURCE_DIR}/README.txt" PROJECT_README) # 在构建时输出读取到的内容 message(STATUS "项目说明:\n${PROJECT_README}")
示例2:读取CMake代码字符串并执行
如果.txt里是CMake代码,但你需要先动态修改内容再执行,可以配合cmake_language(EVAL CODE)命令:
file(READ "${CMAKE_CURRENT_SOURCE_DIR}/dynamic_snippet.txt" SNIPPET_CODE) # 可以在这里对SNIPPET_CODE变量做替换等操作 string(REPLACE "OLD_LIB" "NewLib" SNIPPET_CODE "${SNIPPET_CODE}") # 执行修改后的代码 cmake_language(EVAL CODE "${SNIPPET_CODE}")
注意事项
- 不管用哪种方法,都要确保文件路径正确,推荐使用
CMAKE_CURRENT_SOURCE_DIR(当前CMakeLists.txt所在目录)来构建绝对路径,避免相对路径带来的问题。 - 如果被引入的文件里包含CMake命令,要确保这些命令在当前上下文里是合法的(比如变量是否已定义、目标是否已存在等)。
内容的提问来源于stack exchange,提问作者Dnk8000
相关产品推荐
相关产品推荐

