目录
1. CMake简介
2.环境配置
3.示例程序Hello World
4. 包含其它.h和.cpp文件
本教程面向Linux系统,重点讲解CMake的基本使用方法,用于构建C++项目。采用的平台为Jetson Nano嵌入式开发板,arm64系统。当然,本教程同样适合绝大部分Linux平台。在讲解CMake使用方法之前,先要了解gcc、make和MakeFile的概念。
gcc(GNU Compiler Collection)即为GNU编译器套件,也可以简单认为是编译器,它可以编译很多种编程语言,包括C、C++、Objective-C、Fortran、Java等。当程序只有一个源文件时,直接就可以用gcc命令编译它。但如果源文件太多,一个一个编译就会显得非常繁琐,于是研发人员想到,为什么不设计一种类似批处理的程序,来批处理编译源文件呢,于是就有了make工具。make是一个自动化编译工具,可以使用一条命令实现完全编译。前提是需要编写一个规则文件,make依据该规则文件来批处理执行编译,这个文件就是makefile。对于一个大工程,编写makefile是件极其复杂的事,手动编写不仅耗时且容易出错,于是研发人员又想到,为什么不设计一个工具,读入所有源文件之后,自动生成makefile呢,于是就出现了CMake工具,它能够输出各种各样的makefile或者project文件,从而帮助开发人员减轻负担。但是随之而来也就是编写cmakelists文件,它是CMake所依据的规则。值得注意的是,相对于编写makefile文件,编写cmakelists文件要简单的多。下面这张图完整显示了实际编译的各个步骤及相互关系:
可以看到,CMake生成的makefile文件还不是可执行文件,需要再经过make生成后才是最终的二进制可执行文件。
简而言之,对于实际的C++工程来说,采用CMake工具可以减少项目编译所需要的繁琐工作,简化并加快开发人员生成最终的程序。
为了方便开发,本教程使用QT这款集成开发环境来编写C++代码。首先安装相关软件:
1. 安装CMake
sudo apt-get install cmake
安装完成后使用下述命令查看CMake版本号:
cmake -version
2. 安装QT
sudo apt-get install qt5-default qtcreator -y
按照步骤2安装完QT后,下面首先创建一个入门级程序helloworld。打开QT Creator程序,单击New Project,如下图所示:
然后单击Non-QT Project选择Plain C++ Application,因为此处我们并不需要创建带界面的C++程序,因此只需要创建非QT的普通C++控制台程序即可,如下图所示。
单击Choose进入项目创建界面,按照下图所示输入项目名称helloworld:
单击下一步,选择编译工具为CMake,如下图所示:
然后默认一直单击下一步直至完成创建。此时,QT已经自动为我们创建了一个简单的hello world样例程序,并且创建了CMakeLists.txt文件,如下图所示:
按ctrl+r可以直接运行项目。输出如下:
打开CMakeLists.txt文件,内容如下:
cmake_minimum_required(VERSION 2.8)
project(helloworld)
(${PROJECT_NAME} "main.cpp")
上述代码第一行定义了CMake的版本,方便将来该项目移植到其它平台可以顺利的根据定义的版本进行编译。第二行代码用于设置项目名称,此处即为helloworld。第三行采用了add_executable命令用于生成可执行程序,其中${PROJECT_NAME}指定采用项目名作为最终的生成的可执行程序名,并且使用main.cpp源文件来生成。
QT已经将所有的编译工作进行了简化,使得我们定义好CMakeLists文件以后按ctrl+r即可直接进行编译和项目生成,不需要再使用CMake命令在控制台进行编译。当然,此时可以找到项目同目录下有个新生成的build-helloworld-unknown-Default文件夹,该文件夹存储了整个编译过程的中间文件和最终生成的可执行程序,这些中间文件中包含MakeFile文件。
项目中经常需要引入其它库文件,包括.h头文件和.cpp源文件。下面实现一个自定义的加法函数,学习如何在项目中通过CMake配置引用外部文件。
继续第3节的内容,在helloworld工程目录下面创建两个文件夹,分别命名为include和src。这两个文件夹将作为外部引用文件的头文件和源文件目录。在QT中单击菜单栏“文件”——“新建文件或项目”,首先创建一个头文件mytool.h,如下图所示:
单击choose进入头文件配置界面,选择到include路径,并且填入头文件名为mytool.h,如下图所示:
最后单击完成即可。接下来采用同样的步骤在src目录下创建mytool.cpp文件。
创建完上述两个文件后需要将这两个文件加入到我们的项目中,重新编辑CMakeLists.txt文件如下:
cmake_minimum_required(VERSION 2.8)
project(helloworld)
include)
add_library(lib_tool
src/mytool.cpp
)
link_libraries(lib_tool)
add_executable(${PROJECT_NAME} "main.cpp")
上述代码中INCLUDE_DIRECTORIES用于为项目添加引用目录,这样我们的项目就可以正确的引用include目录下的头文件了。add_library命令用于为项目添加一个库,库名此处定义为lib_tool,库路径中添加相关的源文件,此处为src文件夹下的mytool.cpp文件。然后使用命令link_libraries将库导入进来。按ctrl+s键保存修改,此时QT会根据CMakeLists.cpp的修改自动的修改项目结构,如下图所示:
编辑mytool.cpp文件如下:
#include "mytool.h"
int myadd(int a,int b)
{
return (a+b);
}
该函数为自定义的一个加法函数,实现两个int型变量的加法。
编辑mytool.h文件如下:
#ifndef MYTOOL_H
#define MYTOOL_H
#endif // MYTOOL_H
int myadd(int a,int b);
此处主要是一个申明函数,用于导出该函数。
最后,在main.cpp中调用myadd函数,具体如下:
#include
#include "mytool.h"
using namespace std;
int main()
{
int b=myadd(1,2);
cout << b << endl;
return 0;
}
按ctrl+r运行项目查看输出结果,如下所示:
可以看到程序正确的输出了结果。