cmake的强大之处在于跨平台,对于开发人员来说,不用花费精力去编写makefile了。极大的方便了苦逼的程序员。
现在,通过一个实例简单说明一下cmake的使用
创建名字为hello的工程,工程架构如下:
-
目录结构
├── build 编译生成的中间目录
├── CMakeLists.txt cmake配置
├── src 源文件目录
│ ├── main.c
│ ├── math.c
├── inc 头文件存放目录
│ ├── math.h
├── out 可执行程序输出路径
├── readme 项目介绍 -
各文件内容
工程代码 :
/* main.c 内容 */
#include <stdio.h>
#include <math.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
a = 21;
b = 53;
printf("a= %d; b = %d\n", a, b);
c = add(a, b);
printf("c = %d\n", c);
return 0;
}
/* math.c 内容 */
#include <stdio.h>
int add(int num1, int num2)
{
printf("enter function add\n");
return (num1 + num2);
}
/* math.h 内容: */
#ifndef __MATH_H
#define __MATH_H
int add(int num1, int num2);
#endif
源文件及头文件很简单,此工程主要介绍一下cmake的构建定义文件 CMakeLists.txt 的内容及cmake 编译配置定义
cmake_minimum_required(VERSION 3.6) # 指定最低版本需求 cmake最低版本,如果CMake的当前版本低于指定的版本,它会停止处理工程文件,并报告错误
SET (CMAKE_CXX_COMPILER "gcc") # 设置GCC编译器
PROJECT(hello) # 设置工程名和可支持的语言
INCLUDE_DIRECTORIES (inc) # 指定头文件目录
AUX_SOURCE_DIRECTORY (src DIR_SOURCE) # 遍历 src 源文件并保存在 DIR_SOURCE 变量中
ADD_EXECUTABLE(${PROJECT_NAME} ${DIR_SOURCE}) # 生成可执行文件
SET(CMAKE_BUILD_TYPE Debug) # 设置编译类型debug, debug 版会生成相关调试信息,可以使用GDB 进行
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/out) # 重定义可执行文件路径
对于cmake,他又其特定的语法及宏定义,这里就不跟大家介绍了,大家可以去官网自行去了解(https://cmake.org/)
创建好工程,我们来验证一下
-
进入工程的build路径,生成Make
cmake …/
#cmake 执行路径即CmakeLists.txt所在路径,cmake会根据CmakeLists.txt 生成Makefile; 此过程还会生成一些其他文件(一般可忽略),
CmakeCache.txt 可在其中可更改变量
cmake_install.cmake
CmakeFiles
Makefile cmake根据CmakeLists.txt 生成使用该工程的Makefile -
直接执行编译命令
make
因为CMakeLists.txt 中制定了可执行文件的输出路径为out,所以out中会生成可执行文件hello
3 . 直接运行可执行文件,即可看到执行结果
./hello
涉及到中大型工程,更多的程序员想要通过gdb工具来调试,cmake可直接指定编译参数来支持gdb的。
在cmake中有一个全局的环境变量,CMAKE_BUILD_TYPE,可以取Release或者Debug等值。然后可以通过设置CMAKE_CXX_FLAGS_DEBUG来设置在debug时的CXXFLAGS,这个值大家肯定都熟悉的哈。如果不需要添加调试信息,就直接修改CMAKE_BUILD_TYPE的值。
实现方式即为上述CMakeLists.txt 中的
SET(CMAKE_BUILD_TYPE Debug) # 设置编译类型debug, debug 版会生成相关调试信息,可以使用GDB 进行
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
另外,cmake工具的是一个很强大的跨平台编译工具,这哥简单的例子中没有涉及到一些库的使用及生成,其实cmake是支持的,相关的资料有兴趣的朋友可以联系我,大家一起沟通学习进步。