本文以 Windows 系统 Visual Studio
开发环境下为基础,演示CMake 构建HelloWorld教程。
HelloWorld.cpp
新建文件夹 HelloWorld,新建 C++ 源代码文件 HelloWorld.cpp,编写代码如下:HelloWorld.cpp
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Hello World!\n");
return 0;
}
CMakeLists.txt
在与 HelloWorld.cpp 所在文件夹新建 CMake 脚本文件 CMakeLists.txt,编写代码如下:CMakeLists.txt
# 工程名
project(HelloWorld)
# 构建时输出消息
message(STATUS "This is HelloWorld project.")
# 声明变量,包含当前工程需要包含的源码文件
set(SRC_FILES HelloWorld.cpp)
# 构建可执行程序,需要指定可执行程序的源码文件
add_executable(HelloWorld ${SRC_FILES})
CMakeLists.txt 文件是 CMake 的工程组织脚本,每个文件夹只能存在一个文件,文件名不能更改,CMake 构建时会默认查找指定目录下的 CMakeLists.txt 文件进行构建。
命令说明
project(可选)
指定当前 CMake 工程名称,此名称并非 Visual Studio 的工程名,此名称不影响源代码工程名。如果使用 Visual Studio
构建,project
名称即解决方案(*.sln)名称。
此参数在复杂项目中能够一些非常便利的操作方式,以后的文章中会详细说明。
如果只是构建一个普通的简单项目,此语句可省略。
message(可选)
message 顾名思义,就是平时项目所用的输出消息,在 CMake 构建项目时输出参数指定的消息内容。
CMake 没有像IDE一样调试手段,在构建复杂项目时需要通过输出消息的方式判断当前构建项目是否符合预期的参数设定,或输出调试信息,检查配置是否正确。
函数原型
message([<mode>] "message to display" ...)
常用参数
- FATAL_ERROR 致命错误,终止构建。当指定此参数输出消息时,说明遇到无法处理的错误,停止构建,告诉开发者发生错误的代码位置。
- WARNING 警告。输出警告消息,继续构建。
- STATUS 状态。常用类型之一,输出状态信息。
- (none) or NOTICE 消息。常用类型之一,输出消息。
set(可选)
声明变量,将一组值使用一个变量代替。
函数原型
set(<variable> <value>... [PARENT_SCOPE])
使用方法
CMake 约定使用 ${}
的方式引用变量,如代码中声明变量 SRC_FILES
记录当前当前工程的源码文件,在构建可执行程序时使用 ${SRC_FILES}
的方式引用变量。
可以使用 message(STATUS “${SRC_FILES}”) 的方式查看变量中定义的内容。
add_executable(必选)
根据指定的源码添加一个可执行程序,CMake 将根据当前指令构建源码工程,参数1 <name>
是工程名,是项目构建的关键参数,在复杂的项目中需要修改编译选项,指定链接库,设置构建事件都是通过 <name>
进行关联。
函数原型
add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] [source1] [source2 ...])
前文注明的 可选
命令是为了让 CMake 脚本具有可读性、可扩展性、可维护性,但并非必须的。
如果在一个简单的示例代码中,可以将上文的 CMakeLists.txt
脚本精简成 add_executable(HelloWorld HelloWorld.cpp)
,可以实现同样的效果,但不建议使用此方式。
官方文档
本文只是从实用的角度介绍命令的基本含义和常用方法,如果想要全面了解命令的其他用法,请参见 CMake 的官方文档。
- 本地文档。CMake 安装目录\doc\cmake\html\index.html
- 在线文档。CMake 文档中心(https://cmake.org/cmake/help/v3.15/)
构建(Windows)
构建 Visual Studio 工程
创建存放工程文件文件夹 build
,当前文件结构如下:
│ CMakeLists.txt
│ HelloWorld.cpp
│
└─build
使用命令行提示符 cmd
切换至 build
目录,执行 cmake ..
,输出构建信息如下:
D:\cmake\HelloWorld\build>cmake ..
-- Building for: Visual Studio 14 2015
-- Selecting Windows SDK version to target Windows 10.0.17134.
-- The C compiler identification is MSVC 19.0.24210.0
-- The CXX compiler identification is MSVC 19.0.24210.0
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/cl.exe
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/cl.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/cl.exe
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/cl.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- This is HelloWorld project.
-- Configuring done
-- Generating done
-- Build files have been written to: D:/cmake/HelloWorld/build
从输出信息看到以下信息:
- 编译器版本:
Building for: Visual Studio 14 2015
,当未指定编译器版本时,CMake 会自动从当前环境下选择一个可用的编译器进行构建,Windows 开发环境部署Visual Studio
时默认选择 ,当存在多个版本的Visual Studio
时默认选择最新版本。备注:因为本文构建环境安装Visual Studio 2015
,实际构建以当前开发环境的Visual Studio
版本为准。 message
命令输出的消息This is HelloWorld project.
- 工程文件存放目录:
D:/cmake/HelloWorld/build
构建命令中 ..
表示指定源码的路径为上一级目录,也是 CMakeLists.txt
文件所在目录。
构建完成后,在 build
目录生成 Visual Studio 2015
项目,
指定参数构建
指定构建目录
当需要指定源代码或者构建生成目录时,可以使用 -S
指定源码目录,-B
指定工程生成目录。
CMake 命令行工具参数示例:cmake [options] -S <path-to-source> -B <path-to-build>
指定编译器构建
当构建环境部署多个开发环境时,cmake 构件时可以通过 -G"generator-name"
指定编译器。
例如:
- 构建 NMake 工程
cmake -G"NMake Makefiles" ..
- 构建 VS2012 工程,
cmake -G"Visual Studio 11 2012" ..
本文只列举出两种常用的构建参数,CMake 支持构建参数详情请使用命令行提示符(CMD
)输入 cmake --help
查看详细内容。
编译
本文使用 Visual Studio
开发环境,故使用 VS 打开 HelloWorld.sln,编译源码生成可执行文件。
运行编译后程序,执行结果:
Hello World!
请按任意键继续. . .