说明
- cmake定义:高级编译配置工具
- 多个人用不同的语言或者编译器开发一个项目,最终要输出一个可执行文件或者共享库(dll,so等等),所有操作都是通过编译CMakeLists.txt来完成的
- 学习CMake的目的,为将来处理大型的C/C++/JAVA项目作准备
过程
- 准备程序 main.cpp
- 准备CMakeLists.txt
PROJECT (HELLO)
SET(SRC_LIST main.cpp)
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir " ${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})
# 简化后
PROJECT (HELLO)
ADD_EXECUTABLE(hello main.cpp)
- 使用cmake生成Makefile
- 使用make进行编译
语法介绍
PROJECT 关键字
-
可以用来指定工程的名字和支持的语言,默认支持所有语言
PROJECT (HELLO) 指定了工程的名字,并且支持所有语言建议
PROJECT (HELLO CXX) 指定了工程的名字,并且支持语言是C++
PROJECT (HELLO C CXX) 指定了工程的名字,并且支持语言是C和C++
-
隐式定义了两个CMAKE的变量
<projectname>_BINARY_DIR,本例中是 HELLO_BINARY_DIR
<projectname>_SOURCE_DIR, 本例中是 HELLO_SOURCE_DIR
MESSAGE关键字就可以直接使用这两个变量,当前都指向当前的工作目录
问题:如果改变了工程名,这两个变量名也会改变
解决:又定义了两个预定义变量 PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR,这连个变量和HELLO_BINARY_DIR,HELLO_SOURCE_DIR是一致的
set 关键字
-
用来指定变量
SET(SRC_LIST main.cpp t1.cpp)
MESSAGE 关键字
-
向终端输出用户自定义的信息
-
主要包含三种信息:
- SEND_ERROR,产生错误,生成过程被跳过
- STATUS,输出前缀为–的信息
- FATAL_ERROR,立即终止所有cmake过程
ADD_EXECUTABLE 关键字
- 生成可执行文件
- ADD_EXECUTABLE(hello ${SRC_LIST}) 生成的可执行文件名是hello,源文件读取变量SRC_LIST中的内容
语法的基本规则
- 变量使用$()方式取值,但是在IF控制语句中是直接使用变量名
- 指令(参数1 参数2 … ) 参数使用括号括起,参数之间使用空格或分号分开
- 指令是大小写无关的,参数和变量是大小写相关的,推荐全部使用大写指令
语法注意事项
- SET(SRC_LIST main.cpp) 可以写成 SET(SRC_LIST “main.cpp”),如果源文件名中含有空格,就必须要加引号
- ADD_EXECUTABLE(hello main)后缀可以不写,会自动找.c和.cpp,但是不推荐
内部构建和外部构建
- 上述例子就是内部构建,它生产的临时文件特别多,不方便清理
- 外部构建,就会把生成的临时文件放在build目录下,不会对源文件有任何影响
- 注意外部构建的两个变量
- HELLO_SOURCE_DIR 还是工程路径
- HELLO_BINARY_DIR 编译路径,就是build/路径
创建一个工程
- build, 外部构建的目录
- src,用来存放工程源代码
- doc,用来存放这个工程的文档
- COPYRIGHT,README
- run.sh脚本,用来调用二进制
- bin, 用来存放构建后的目标文件
.
|_ build
|_ CMakeLists.txt
|_ src
|_ CMakeLists.txt
|_ main.cpp
|_ bin
|_ doc
|_ run.sh
|_ COPYRIGHT
|_ README
- 外部CMakeLists.txt
PROJECT(HELLO)
ADD_SUBDIRECTORY(src bin)
- src下的CMakeLists.txt
ADD_EXECUTABLE(hello main.cpp)