cmake进阶:文件操作之写文件

一. 简介

cmake 提供了 file() 命令可对文件进行一系列操作,譬如读写文件、删除文件、文件重命名、拷贝文件、创建目录等等。 接下来 学习这个功能强大的 file() 命令。
本文学习 CMakeLists.txt语法中写文件操作。

二. cmake进阶:文件操作之写文件

1. 写文件:写、追加内容

使用 file() 命令写文件,使用方式如下所示:

复制代码
file(WRITE <filename> <content>...)
file(APPEND <filename> <content>...)

将 <content> 写入名为 <filename> 的文件中。如果文件不存在,它将被创建;
如果文件已经存在, WRITE 模式将覆盖它, APPEND 模式将内容追加到文件末尾。
准备一个工程,在工程根目录下的 CMakeLists.txt文件中加入如下代码:

复制代码
# file()写文件测试
file(WRITE wtest.txt "Hello World!") #给定内容生成 wtest.txt 文件
file(APPEND wtest.txt " China") #给定内容追加到 wtest.txt 文件末尾

注意文件可以使用绝对路径或相对路径指定,相对路径被解释为相对于当前源码路径。

进入工程 build目录下,执行 "cmake .."命令后,会在当前源码目录下生成一个名为 wtest.txt 的件,如下所示:

接着查看 wtest.txt 文件中内容,如下所示:

2. 写文件:由内容生成文件

由内容生成文件的命令为:

复制代码
file(GENERATE OUTPUT output-file
    <INPUT input-file|CONTENT content>
    [CONDITION expression])

output-file :指定输出文件名,可以带路径(绝对路径或相对路径);
INPUT input-file :指定输入文件,通过输入文件的内容来生成输出文件;
CONTENT content :指定内容,直接指定内容来生成输出文件;
CONDITION expression :如果表达式 expression 条件判断为真,则生成文件、否则不生成文件。

同样,指定文件既可以使用相对路径、也可使用绝对路径,不过在这里,相对路径被解释为相对于当前源码的 BINARY_DIR 路径,而不是当前源码路径。

在工程根目录下的 CMakeLists.txt文件中加入如下代码:

复制代码
# 由前面生成的 wtest.txt 中的内容去生成 out1.txt 文件
file(GENERATE OUTPUT out1.txt INPUT "${PROJECT_SOURCE_DIR}/wtest.txt")

# 由指定的内容生成 out2.txt
file(GENERATE OUTPUT out2.txt CONTENT "This is the out2.txt file")

# 由指定的内容生成 out3.txt,加上条件控制,用户可根据实际情况
# 用表达式判断是否需要生成文件,这里只是演示,直接是 1
file(GENERATE OUTPUT out3.txt CONTENT "This is the out3.txt file" CONDITION 1)

注意:这里 Linux系统上的 cmake安装的哪个版本,则在 CMakeLists.txt中关于最低版本需要设置为 所安装的 cmake版本号。否则,会在下一步 "cmake .." 命令后报错。
进入到 build 目录下执行 " cmake .." 命令 :

执行完 cmake 之后会在 build 目录(也就是顶层源码的 BINARY_DIR )下生成了 out1.txt 、 out2.txt 和 out3.txt 三个文件,内容如下:

关于 cmake写文件学习到这里。

相关推荐
Two_brushes.1 小时前
【linux 网络】网络基础
linux·网络
Code Warrior1 小时前
【Linux】基础开发工具(3)
linux·服务器
鬼才血脉2 小时前
Linux(centos)安装 MySQL 8
linux·mysql·centos
guygg882 小时前
ubuntu手动编译VTK9.3 Generating qmltypes file 失败
linux·运维·ubuntu
JeffersonZU2 小时前
Linux/Unix 套接字Socket编程(socket基本概念,流程,流式/数据报socket,Unix domain socket示例)
linux·c语言·tcp/ip·udp·unix·gnu
Two_brushes.3 小时前
【linux网络】网络编程全流程详解:从套接字基础到 UDP/TCP 通信实战
linux·开发语言·网络·tcp/udp
夕泠爱吃糖3 小时前
Linux中的静态库和动态库
linux·运维·服务器
比奥利奥还傲.4 小时前
Linux运维安全新范式:基于TCPIP与SSH密钥的无密码认证实战
linux·运维·安全
果子⌂6 小时前
容器技术入门之Docker环境部署
linux·运维·docker
深度学习04076 小时前
【Linux服务器】-安装ftp与sftp服务
linux·运维·服务器