使用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_POSTFIX | Debug/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) 生成静态库