GCC/make/CMake/Makefile基础知识

GCC

GCC的初衷是为GNU操作系统专门编写一款编译器,现已被大多数类Unix操作系统(如Linux、BSD、MacOS X等)采纳为标准的编译器,甚至在微软的Windows上也可以使用GCC。GCC支持多种计算机体系结构芯片,如x86、ARM、MIPS等,并已被移植到其他多种硬件平台。

GCC原名为GNU C语言编译器(GNU C Compiler),只能处理C语言。但其很快扩展,变得可处理C++,后来又扩展为能够支持更多编程语言,如Fortran、Pascal、Objective -C、Java、Ada、Go以及各类处理器架构上的汇编语言等,所以改名GNU编译器套件(GNU Compiler Collection)。

GCC是编译器,可以把源码编译 可执行文件动态链接库 ,例如:

#include <iostream>
int main(int, char**) {
std::cout << "Hello, world!\n";
}

编译动态dll库(–shared选项指定生成动态连接库):

gcc -lstdc++ --shared main.cpp -o main.dll

编译可执行文件:

gcc -lstdc++ main.cpp -o main

mac下使用clang命令执行

make & Makefile

make只是一个根据指定的Shell命令进行构建的工具,它的规则很简单,你规定要构建哪个文件、它依赖哪些源文件,当那些文件有变动时,如何重新构建它。

源文件首先会生成中间目标文件(O文件或是OBJ文件),再由中间目标文件生成执行文件。无论是C、C++,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。

make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。

Makefile 文件描述了 Linux 系统下 C/C++ 工程的编译规则它用来自动化编译 C/C++ 项目。一旦写编写好 Makefile 文件,只需要一个 make 命令,整个工程就开始自动编译,不再需要手动执行 GCC 命令

CMake

CMake(cross platform make)是一个开源的跨平台构建工具,可以对代码进行编译、测试及打包操作。

Make工具里面比较出名的有GNU Make,QT 的qmake,微软的MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。

这样就带来了一个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用上面的 Make 工具,就得为每一种标准写一次 Makefile ,这将是一件让人抓狂的工作。

因此CMake应运而生,它可以让程序员通过一个与开发平台无关的CMakeList.txt文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的Makefile和工程文件