视觉教程第四弹:CMake构建工具的介绍
机械是血肉,电控是大脑,视觉是灵魂。
一、C++代码编译
1.1 单文件编译
如果你曾经在linux环境下编写过c/c++的简单代码,你可能会使用gcc/g++命令直接编译该源文件,生成可执行文件。使用命令g++ main.cpp
可以将main.cpp中所写的代码编译生成默认文件名为a.out的可执行文件。
而在windows环境下,如果使用过DevC++等IDE,也可以直接将一个源文件编译成可执行文件。
1.2 多文件编译
而在大型工程项目中,程序不可能仅由单一的源文件编写而成。采用多文件编译有很多好处,比如:
- 缩减编译时间。如果将所有代码编写在同一文件中,即使一处小的修改也要重新编译整个代码,导致编译时间太长。
- 功能模块化。将实现不同类功能的代码拆分成不同文件,起到模块化的作用,同时文件目录分层,便于检索特定代码。
- 功能插件化。同一功能可以有不同的实现,在不确定采用那种实现时,可以将不同实现编写在不同文件,通过编译不同文件达到功能插件化的效果。
涉及到多文件编译时,通常就会涉及到一个名词“工程”。简单的,在linux环境下,我们可以使用命令g++ src1.cpp src2.cpp ...
来将多个源文件编译成一个可执行文件。但在实际的工程中,往往并不是仅仅将多个源文件编译到一起就可以,可能还会涉及其他问题,比如:
- 外部依赖项。包括,需要将第三方软件库的头文件目录添加到编译期的头文件搜索目录中,以找到第三方库的头文件;需要将第三方库的链接库(如果有的话)链接到程序中;也可能根据当前编译环境是否有某个第三方库,而选择是否开启编译某部分源代码。等。
- 不同源文件需要不同的编译配置。如,有的源文件可能需要特殊的编译优化等级,而其他的不需要;有的源文件需要链接到外部库,而其他的不需要;有的源文件需要添加外部库的头文件目录,而其他的不需要。等。
- 编译时选项。有时用户可能希望在编译时指定是否启用某些功能,而不必修改代码。
二、什么是CMake
为解决上述问题,CMake工具顺应而生。其实针对那些问题,早已有一些解决方法,但CMake可以说是做的最好的那一个。它可以完成的功能包括:多文件编译;管理外部依赖;代码模块化;编译结果安装;等。
RoboMaster中的视觉代码,通常也是一个比较庞大的c++工程项目,所以采用CMake作为最主要的项目构建工具。
三、CMake基本使用
网络上已经有很多不错的教程用于介绍CMake的使用方法,这里我贴出几个我认为讲的比较好的链接:
上面的教程基本介绍完了cmake的基本用法,而在后期实际编程使用时,如果遇到了一些需求不知道如何实现,也可以查阅CMake官网的API手册。
四、作业与思考题
- 完成上面链接cmake-examples中,至少前三个example。
作者:唐欣阳,github主页:传送门。