索引指南
老生常谈GNU的GCC/G++Windows的Mingw/MSVCLLVM的clang/clang++Make/CMake经常在编程环境配置中遇到诸如GNU的gcc/g++、LLVM的clang/clang++、Windows的Mingw/MSVC、还有CMake。
老生常谈
开始放一段hello.c
#include <stdio.h>int main(){printf("Hello World");return 0;}
假如让这段代码在Linux上运行,我们需要使用GCC
1、预编译:将hello.c和stdio.h预编译为hello.i
2、编译:将hello.i编译为hello.s
3、汇编:将hello.s翻译为机器指令hello.o(.o目标文件)
4、链接:链接各种需要的库和其他目标文件(该hello程序不需要)得到可执行文件hello.out(相当于windows的.exe)
整个过程将高级语言翻译成了机器语言,而编译器,就是这样的一个工具。GCC可以完成从预编译,编译,汇编,链接整个过程。
GNU的GCC/G++
1、GUN是什么
首先GNU是什么呢,GNU计划,又称革奴计划。它的目标是创建一套完全自由的操作系统。但是具有完备功能的内核尚未被开发成功,在实际使用中,多半使用Linux内核、FreeBSD等替代方案,作为系统核心,其中主要的操作系统是Linux的发行版。Linux操作系统包涵了Linux内核与其他自由软件项目中的GNU组件和软件,可以被称为GNU/Linux,简称Linux!
2、GCC和G++
我们可以将GCC/G++看成一个整体,不存在GCC专门编译C语言,G++专门编译C++语言这种分别。因为编程语言发展至今是非常复杂的,编译器同样也是。我们将两者都看成GCC,GCC支持C、C++和Fortran语言。而GCC(GNU Compiler Collection,GNU编译器集合),就是GNU运动的代表性成果,它的初衷是为GNU的自由系统开发完整的编译器。
所以,在Linux甚至Windows上各种涉及开发环境配置,源码编译的地方,都离不开gcc和g++。
Windows的Mingw/MSVC
MinGW(Minimalist GNUfor Windows),它是一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合,允许你在Windows平台生成本地的Windows程序而不需要第三方C运行时(C Runtime)库。运行时库:支持程序运行的基本函数的集合,一般是静态库lib或动态库dll。
而MSVC,就是上文所说的第三方C运行时库:由微软开发的VC运行时库,被Visual Studio IDE所集成。所以我们使用VS时会附带MSVC编译器。所以可以看到啦,MinGW和MSVC都是Windows C/C++语言编译支持,配置环境时遇到两者择其一即可。
LLVM的clang/clang++
LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。
LLVM计划启动于2000年,最初由美国UIUC大学的Chris Lattner博士主持开展。Chris Lattner加盟Apple Inc.并致力于LLVM在Apple开发体系中的应用。Apple也是LLVM计划的主要资助者。目前LLVM已经被苹果IOS开发工具、Xilinx Vivado、Facebook、Google等各大公司采用。
Make/CMake
有了编译器GCC等, 为什么要有make这个构建生成器,同样是老生常谈的内容。
编译hello.c非常简单,只需要
$ gcc hello.c
但当项目庞大起来后,假设hello.c依赖与a.c、b.c,而a.c又依赖于库w.lib,每一次编译,我们都要重新编写一次gcc编译命令行吗?
所以,GNU发明了make这个工具软件,可以编写makefile文件来指定特定的项目构建过程,当项目一个文件的代码更改时,我们只需要重新make一下就可以了。
但make依然有很多不足,比如
make对于类unix系统是通用的,但对windows系统并不友好(不能跨平台)。make语法简单,也就导致了它功能的限制。不同编译器的语法规则不同,编写的makefile语法如果适合GCC则不适合MSVC。
所以CMake就应运而生啦。
CMake是比Make更高一层的工具,Make是编写对应编译器的makefile从而实现编译,而CMake是写一份独立的CmakeList.txt文件,然后该文件会根据当前系统环境选择适合的构建生成器(如VS或者make),然后将CmakeList.txt翻译为适合的文件,再进一步调用系统编译器进行项目构建。
重要指令和CMake常用变量
CMake 编译工程