CMake入门

使用CMake编译

CMake工具用于生成Makefile文件。用户通过编写CMakeLists.txt文件,描述构建过程(编译、连接、测试、打包),之后通过解析该文件,生成目标平台的Makefile文件,做到"Write once, run everywhere"。

使用方法:

$ cmake <projectPath>

确保projectPath目录下,有CMakeLists.txt文件。该文件当然是用户来编写,所以重点是编写CMakeLists.txt,语法可以参考《CMake 入门实战》,或者官方入门文档

注意: 在Windows下使用时,需要使用VS自带的命令行,不然会找不到cl工具的错误。

成功执行cmake命令后,目录下会生成Makefile文件,不同编译平台生成的文件不同,编译工具也不同。

  • 如果构建平台是MinGW,会生成makefile文件,使用mingw32-make构建。
  • 如果构建平台是VS系列,会生成vcxproj文件,可以使用msbuild工具构建。
  • 如果构造平台是NMake,可以使用nmake构建。

可以使用以下命令编译:

$ cmake --build <CMakeCachePath> --target <ProjectName>

CMakeCachePath是指CMakeCache.txt(或CMakeFiles文件夹)所在的路径。

可以使用以下命令清理编译结果:

cmake --build <CMakeCachePath> --target clean

如果CMakeLists.txt文件有修改,再次执行cmake命令,会更新Makefile文件。

编译平台

使用如下命令查看支持的构建工具:

$ cmake -G

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UThRQwUj-1638181332181)(res/构建平台.png)]

在生成Makefile时,指定构建工具:

$ cmake -G "<generator>" <projectPath>

generator可以是等号左边的名字。例如,在Windows下,默认生成vcxproj文件(cmake 3.13.0-rc3 + VS2017),如果希望使用nmake构建,可以使用以下命令:

$ cmake -G "NMake Makefiles" <projectPath>

清理生成文件

存在一个问题,没找到较好的解决方案,如何清理CMake产生的文件?

可以使用"-B"参数指定生成目录,这样CMake生成的文件都会集中在这个文件,例如:

$ cmake -B <buildPath> .

之后在编译操作,均要在buildPath文件夹下执行。

特别的,还可以使用"-S"参数指定源码所在的文件夹,源码文件夹必须包含CMakeLists.txt。

详情可以参考CMake官网

CMakeLists.txt编写

CMakeLists.txt由命令构成,每条命令占一行,换行符结尾,命令的格式如下:

commandName(arg1 arg2 …)

命令名不区分大小写参数间使用空格分隔

在CMakeLists.txt中,字符串同C语言中一样,使用双引号包含

输出

使用message()命令,输出信息,至少接受两个参数:

第一个参数指定信息的等级,为空的时候为重要信息,通常使用"STATUS"作为参数,代表该信息为普通说明信息。

第二个参数为一个字符串,可以跟随多个字符串。

例如:

message(STATUS "Hello World")

变量

使用set()命令,自定义变量,至少接受两个参数,第一个参数为变量名,第二个参数为变量的值。参数如果多于2个,那么该变量为一个集合。

特别的,可以使用以下命令设置系统环境变量:

set(ENV{<VARIABLE>} <value>...)

访问变量的格式如下:

${<variable>}

访问系统环境变量需要以下格式:

$ENV{<variable>}

CMake内置了许多变量,可以参考CMake官网,常用的有:

PROJECT_NAME项目名
PROJECT_BINARY_DIR项目编译输出路径,调用cmake命令时,使用"-B"参数指定,默认为CMakeLists.txt所在的文件。
PROJECT_SOURCE_DIR项目源码路径,调用cmake命令时,使用"-S"参数指定,默认为CMakeLists.txt所在的文件。
CMAKE_DEBUG_POSTFIXCMAKE_RELEASE_POSTFIXDebug/Release版的动态库后缀
CMAKE_BUILD_TYPE编译类型(Debug、Release),该变量默认为空值

内置变量可以在调用cmake命令时,使用"-D"参数设置:

$ cmake -D <var>:<type>=<value>, -D <var>=<value>

添加库

add_library命令如下:

add_library(<name> [STATIC | SHARED | MODULE]
            [EXCLUDE_FROM_ALL]
            [<source>...])

例子

编译

推荐使用以下命令编译,这样生成的文件集中在build文件夹下,不会污染源码文件夹。

#cd进入CMakeLists.txt所在的文件夹
$ cmake -B .\build .
$ cmake --build .\build --target <ProjectName>

生成可执行文件

# 指定cmake最低版本
cmake_minimum_required(VERSION 2.8)

# 指定项目名
project(CppDemo)

# 生成可执行文件,第一个参数为目标名,之后参数为源文件列表
add_executable(${PROJECT_NAME} "main.cpp")

生成动态库

cmake_minimum_required(VERSION 2.8)
project(HelloWorld)

# 添加头文件
include_directories($ENV{JAVA_HOME}/include $ENV{JAVA_HOME}/include/win32)

# 设置生成目录
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR})

# 生成链接库文件,三个参数分别是链接库名、链接库类型、源码文件
add_library(${PROJECT_NAME} SHARED HelloWorld.cpp)
# add_library(${PROJECT_NAME} STATIC HelloWorld.cpp) 生成静态库
CMake是一个跨平台的开源构建系统,它帮助开发者在多种操作系统上自动化软件项目的构建过程。以下是CMake入门的一些步骤和基本概念: 1. **安装CMake**:首先,你需要从CMake官网下载并安装适用于你的系统的版本。对于Windows、Mac OS和Linux都有预打包的二进制包可供选择。 2. **创建CMakeLists.txt**:这是CMake的核心,它是描述你的项目结构和依赖关系的文本文件。通常放在项目根目录下。 3. **配置生成器**:CMake支持多种构建系统,如Unix Makefiles、Visual Studio等。通过命令行指定`cmake -G`选项,告诉CMake你想要哪种生成器。 4. **生成构建文件**:运行`cmake`命令初始化CMake流程,生成对应的构建文件(如Makefile或Visual Studio解决方案文件)。 5. **构建项目**:根据选定的构建系统(如make或msbuild),运行`make`或`cmake --build .`命令来实际构建你的程序。 6. **添加变量和指令**:CMake提供了许多变量和函数,如设置源代码路径、添加库依赖、设置编译选项等,可以灵活调整构建配置。 7. **了解基本语法**:学习CMake的基本语法,如IF()条件语句、ADD_EXECUTABLE()添加可执行文件、INCLUDE()导入外部CMakeLists.txt等。 8. **实践项目**:通过参与一些小型项目或者使用官方的示例来熟悉CMake的工作流程。 **相关问题--** 1. CMake有哪些常见的错误及其解决办法是什么? 2. 如何在CMakeLists.txt中处理不同平台的差异? 3. 怎样在已经存在的CMake项目中添加新的模块或依赖?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值