文章目录
一、CMake概述
CMake是一个项目构建工具,并且是跨平台的。关于项目构建我们所熟知的还有Makefile (通过make命令进行项目的构建),大多是IDE软件都集成了make,比如: VS的nmake、linux下的GNU make、Qt的qmake等,如果自己动手写makefile,会发现makefile 通常依赖于当前的编译平台,而且编写makefile的工作量比较大,解决依赖关系时也容易出错。
而CMake恰好能解决上述问题,其允许开发者指定整个工程的编译流程,在根据编译平台,自动生成本地化的Makefile和工程文件,最后用户只需make 编译即可,所以可以把CMake看成一款自动生成Makefile的工具,其编译流程如下图:
蓝色虚线表示使用makefile构建项目的过程
红色实线表示使用cmake构建项目的过程
介绍完CMake的作用之后,再来总结一下它的优点:
跨平台
能够管理大型项目
简化编译构建过程和编译过程
可扩展:可以为cmake 编写特定功能的模块,扩充 cmake功能
二、CMake的使用
CMake支持大写、小写、混合大小写的命令。如果在编写CHakeLists.txt 文件时使用的工具有对应的命令提示,那么大小写随缘即可,不要太过在意。
1.注释
CMake使用#进行行注释,可以放在任何位置。
#这是一个CMakeLists.txt 文件
cmake_minmum_required(VERSION 3.0.0)
CMake使用#[[]]形式进行块注释。
#[[这是一个CMakeLists.txt 文件
这是一个CMakeLists.txt 文件
这是一个CMakeLists.txt 文件]]
cmake_minmum_required(VERSION 3.0.0)
2.简单编译程序
1.测试源文件
1.head.h
#ifndef _HEAD_H
#define _HEAD_H
int add(int a,int b);
int subtract(int a,int b);
int multiply(int a,int b);
int divide(int a,int b);
#endif
2.add.cc
#include "head.h"
int add(int a,int b)
{
return a + b;
}
3.subtract.cc
#include "head.h"
int subtract(int a,int b)
{
return a - b;
}
4.multiply.cc
#include "head.h"
int multiply(int a,int b)
{
return a * b;
}
5.divide.cc
#include "head.h"
int divide(int a,int b)
{
return (double)a / b;
}
6.main.cc
#include "head.h"
#include <iostream>
int main()
{
int a = 20,b = 12;
std::cout << "a = " << a << " b = " << b << std::endl;
std::cout << "a + b = " << add(a,b) << std::endl;
std::cout << "a - b = " << subtract(a,b) << std::endl;
std::cout << "a * b = " << multiply(a,b) << std::endl;
std::cout << "a / b = " << divide(a,b) << std::endl;
return 0;
}
上述代码的目录结构树如下:
-- v1
|-- add.cc
|-- divide.cc
|-- head.h
|-- main.cc
|-- multiply.cc
`-- subtract.cc
我们可以使用如下指令进行编译:
g++ *.cc -o main
2…添加CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(CALC)
add_executable(main main.cc add.cc subtract.cc multiply.cc divide.cc)
cmake_minimum_required:指定使用的cmake的最低版本(可选,非必选,如果不加可能会有警告)
project:定义过程名称,并可指定工程的版本,工程描述,web主页地址,支持的语言(默认情况支持所有语言),如果不需要这些都是可以忽略的,只需要指定出过程的名字即可。
project指令的语法格式如下:
project(<PROJECT-NAME> [<language-name>...])
project(<PROJECT-NAHE>
[VERSION <major>[.<minor>[.<patch>[.ctweak>]]]]
[DESCRIPTION <project-description-string>]
[HONEPAGE_URL <url-string>]
[LANGUAGES <language-name> ...])
add_executable :定义工程会生成一个可执行程序
add_executable(可执行程序名 源文件名称)
这里的可执行程序名和project中的项目名没有任何关系
源文件名可以是