1 C/C++编译工具进化
C/C++开发中使用到的代码编译工具GCC、make、cmake,进化历程如下。
1) 为什么需要gcc?
试想,我们写了一份C++源码文件main.cpp,该如何让它变成可执行文件呢?对,用编译器将源码文件翻译成可执行文件,此时就会用到GCC。
GCC:GNU Compiler Collection。可以简单理解为编译器,其主要作用就是将源码文件编译为可执行文件(gcc相关内容较多,不是本片重点,不展开讲)。
gcc -C main.cpp -o myApp
以上命令可以帮助我们将源码文件 main.cpp 生成可执行文件 myApp。所以 gcc 实际上是为我们提供了一套编译工具。
2)为什么需要make?
实际上,在一个项目/工程中会包含很多源码文件(注意,头文件一般不会单独编译,而是作为源文件的附属文件展开),此时编译命令就会变得冗长、繁杂,每次编译都会额外浪费大量的时间和精力,因此就需要一个自动化工具来帮助我们完成这些工作,make就是这些工具中很杰出的一位。
make:GNU Make。通过编写的Makefile脚本文件描述整个工程的编译、链接规则,然后一键编译项目。注意,make需要我们提前写好Makefile脚本,然后make工具根据Makefile描述的规则编译代码。假设我们的工程有main.cpp、MyFunction.c两个源文件,我们只需要写如下Makefile
/* MakeFile */
myApp.exe : ../main.cpp ../MyFunction.c
gcc -o myApp ../main.cpp ../MyFunction.c
然后执行命令
make
即可得到我们想要的可执行文件 myApp。(由于我们举的例子比较轻量,没展示出make的威力,在大型工程中make带来的收益是巨大的)
3)为什么需要cmake?
由于Makefile的语法比较复杂,对于比较大的项目Makefile的复杂度也很高,所以当项目的物理结构发生变化时维护Makefile也是一项比较困难的工作。为了让程序员从Makefile中解脱出来,cmake诞生了。
cmake:跨平台的安装(编译)工具。cmake可以用来生成工其他源码编译工具使用的Makefile、Project等文件。cmake依赖于规则描述文件CMakeList.txt,写好CMakeList.txt后执行cmake命令,即可得到我们需要的Makefile,然后执行make命令生成可执行文件。
已前面的代码为例,我们只需要写如下CMakeList.txt。
cmake_minimum_required(VERSION 3.0)
project(myApp)
MESSAGE(${CMAKE_CURRENT_SOURCE_DIR})
MESSAGE(${CMAKE_C_COMPILER})
file(GLOB_RECURSE files
./main.cpp
./MyFunction.c
)
add_executable(myApp ${files})
顺序执行命令
# first
cmake
# then
make
即可得到我们需要的可执行文件myApp。
2 CMakeList.txt
目前,我们经常用到的编译工具就是cmake和make。先用cmake生成Makefile,然后使用make将源码文件(集)编译为可执行文件。
这两个工具使用起来非常简单,只需要顺序cmake、make即可,但是cmake需要读规则描述文件CMakeList.txt,所以执行命令之前我们需要提供CMakeList.txt文件。
CMakeList.txt的书写规则: