cmake使用教程
本文主要借鉴《CMake+Pratice》一文,如果造成版权问题请联系作者删除。作者在网络上发现关于cmake的中英文材料都比较少,所以有了整理cmake的入门教程的想法。如果需要深入了解cmake的各种命令,建议在已有的项目中学习。在介绍本文的cmake内容之前,本文将整个使用教程分成七篇文章。
一、初识cmake
官网:www.cmake.org
优点:
1、开源代码,使用类BSD许可发布。
2、跨平台,并可以生成native编译配置文件,在linux/Unix平台,生成makefile,在苹果平台可以生成Xcode,在windows平台,可以生成MSVC的工程文件。
3、能够管理大型项目。
4、简化编译构建过程和编译过程。cmake的工具链:cmake+make。
5、高效率,因为cmake在工具链中没有libtool。
6、可扩展,可以为cmake编写特定功能的模块,扩展cmake功能。
缺点:
1、cmake只是看起来比较简单,使用并不简单;
2、每个项目使用一个CMakeLists.txt(每个目录一个),使用的是cmake语法。
3、cmake跟已有体系配合不是特别的理想,比如pkgconfig。
二、安装cmake
下载:centos7 yum -y install cmake
三、cmake的helloworld
1、准备工作
先在/backup/cmake下建立第一个练习目录t1。在t1下添加两个文件,分别是main.c和CMakeLists.txt。内容如下:
2、开始构建
指令: cmake .
成功建立如下:
可以发现,系统自动生成了如下的文件
包括:CMakeCache.txt、CMakeFiles、cmake_install.cmake、Makefile等中间文件。
指令:make
PS:可以使用make VERBOSE=1来查看make构建的详细过程。
这个时候已经生成了hello.
指令:./hello
以上是cmake构建的全部过程。
3、详细解释
对CMakeLists.txt的详细解释:
PROJECT(projectname [CXX] [C] [Java])
用这个指令定义工程名称,并且可以指定工程支持的语言,支持的语言列表是可以忽略的,默认情况表示支持所有语言。这个指令隐式的定义了两个cmake的变量:
<projectname>_BINARY_DIR
<projectname>_SOURCE_DIR
这两个变量可以用(这样不用担心写错工程名称)。
PROJECT_BINARY_DIR
PROJECT_SOURCE_DIR
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
这里先了解SET指令可以用来显示的定义变量即可。这里是
SET(SRC_LIST main.c)
如果有多个源文件,也可以定义为:
SET(SRC_LIST main.c t1.c t2.c)
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message")
这个指令是向终端输出用户定义的信息,包含三种类型:
SEND_ERROR#产生错误,生成过程被跳过。
STATUS#输出前缀为--d的信息。
FATAL_ERROR#立即终止所有的cmake过程。
ADD_EXECUTABLE(hello ${SRC_LIST})
定义了一个为hello的可执行文件,相关的源文件是SRC_LIST中定义的源文件列表。
本例可以简化为如下CMakeList.txt
PROJECT(HELLO)
ADD_EXECUTABLE(hello main.c)
4、基本的语法规则
使用${}方式来取得变量中的值,而在IF语句中则直接使用变量名。
指令(参数1 参数2 …)
参数之间使用空格或者分号分隔开。如果加入一个函数fun.c
ADD_EXETABLE(hello main.c;fun.c)
指令是大小写无关的,参数和变量是大小写相关的。但是推荐你全部使用大写指令。
5、关于语法的困惑
可以使用双引号“”将源文件包含起来。处理特别难处理的名字比如fun c.c,则使用SET(SRC_LIST "fun c.c")
可以防止报错。
6、清理工程
可以使用make clean
清理makefile产生的中间的文件,但是,不能使用make distclean清除cmake产生的中间件。如果需要删除cmake的中间件,可以采用rm -rf *
来删除中间件。
7、外部构建
在目录下建立一个build文件用来存储cmake产生的中间件,不过需要使用cmake …来运行。其中外部编译,PROJECT_SOURCE_DIR
仍然指代工程路径,即/backup/cmake/t1,而PROJECT_BINARY_DIR
指代编译路径,即/backup/cmake/t1/build。