一、什么是CMake
“CMake”这个名字是“cross platform
make”的缩写。虽然名字中含有“make”,但是CMake和Unix上常见的“make”系统是分开的,而且更为高阶。 CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是
CMake 的组态档取名为 CMakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的
projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是CMake 和 SCons 等其他类似系统的区别之处。
二、为什么学习CMake
方便处理大型的C/C++ 项目
三、安装
1、大多数的liunx系统已经安装
2、官网下载地址https://cmake.org/download/
3、安装语句:
yum install cmake
四、demo01
1、新建一个main.c 文件名,并且编译通过
touch main.c
#include <stdio.h>
void main(){
printf("hello!\n");
}
gcc main.c
./a.out
2、删除工程的执行文件a.out
rm -rf a.out
3、新建CMakeLists.txt文件,需要严格区分大小写
touch CMakeLists.txt
4、添加 CMakeLists.txt 内容
cmake_minimum_required(VERSION 2.8.12)
project(DEMO01)
SET(SYSTEM_LINK_LIB main.c)
add_executable(main ${SYSTEM_LINK_LIB})
终端指令:
cmake . //当前目录
make //执行Makefile 生成执行文件
注意事项
1、cmake的内置命令是不区分大小写的,但是所有的变量区分大小写
2、PROJECT_SOURCE_DIR 与 PROJECT_BINARY_DIR
cmake系统预定义变量: 指定工程路径
- PROJECT_SOURCE_DIR/CMAKE_SOURCE_DIR/_SOURCE_DIR: 为包含PROJECT()命令的最近一个CMakeLists.txt文件所在的文件夹路径。
- PROJECT_BINARY_DIR/CMAKE_BINARY_DIR/_BINARY_DIR: 运行cmake命令的目录,即工程编译发生的路径。
3、EXECUTABLE_OUTPUT_PATH 与 LIBRARY_OUTPUT_PATH
cmake系统预定义变量:
- EXECUTABLE_OUTPUT_PATH: 指定最终的可执行文件的位置
- LIBRARY_OUTPUT_PATH: 设置库文件的输出目录
以上两变量在新版本中已被
CMAKE_RUNTIME_OUTPUT_DIRECTORY
和CMAKE_ARCHIVE_OUTPUT_DIRECTORY
代替
上面的示例使用的是内部构件,下面删除工程生成二点文件,使用外部构建的方法
五、外部构建
1、新建一个文件夹
mkdir bulid
2、 上一级目录
cmake ..
3、生成执行文件
make
一个简单的工程开始了
- 添加子目录src 存放工程文档
- 添加子目录doc 存放工程文档
- 在工程目录添加 文本 文档 COPYRIHT ,README
- 在工程目录添加一个runhello.sh 脚本 ,用来调用hellode 二进制文件
- 将构建后的目标文件存放入构建目录的子目录
- 将doc目录的内容,以及COPYRIGHT,README安装到/usr/share/cmake/
1、连接子目录
2、编辑CMakeLists.txt
项目目录下的CMakeLists.txt
cmake_minimum_required(VERSION 2.8.12)
project(DEMO)
add_subdirectory(src bin)
src 下的CMakeLists.txt
cmake_minimum_required(VERSION 2.8.12)
add_executable(main main.c)
到bulid目录下,执行语句
cmake ..
make
生成的可执行文件位于bin目录
执行输出
- add_subdirectory (source_dir [binary_dir]
add_subdirectory (source_dir [binary_dir] [EXCLUDE_FROM_ALL])
添加一个子目录并构建该子目录。source_dir
必选参数。该参数指定一个子目录,子目录下应该包含CMakeLists.txt文件和代码文件。子目录可以是相对路径也可以是绝对路径,如果是相对路径,则是相对当前目录的一个相对路径。
binary_dir
可选参数。该参数指定一个目录,用于存放输出文件。可以是相对路径也可以是绝对路径,如果是相对路径,则是相对当前输出目录的一个相对路径。如果该参数没有指定,则默认的输出目录使用source_dir。
EXCLUDE_FROM_ALL
可选参数。当指定了该参数,则子目录下的目标不会被父目录下的目标文件包含进去,父目录的CMakeLists.txt不会构建子目录的目标文件,必须在子目录下显式去构建。例外情况:当父目录的目标依赖于子目录的目标,则子目录的目标仍然会被构建出来以满足依赖关系(例如使用了target_link_libraries)。
参考资料:
1、CMAKE常用内置变量解释:CMAKE_SOURCE_DIR/EXECUTABLE_OUTPUT_PATH/CMAKE_EXPORT_COMPILE_COMMANDS
2、Cmake命令之add_subdirectory介绍