在整个大学的学习进程中,经常在各种编程环境装备中遇到诸如GNU的gcc/g++、LLVM的clang/clang++、Windows的Mingw/MSVC、还有CMake。

本文希望能捋一捋这些名词之间的关系,这将有助于理解各种环境装备中的各种操作,并且能对程序运转自身有更为深化的理解。

陈词滥调

在开始之前咱们先放一段Hello World: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能够完结从预编译编译,汇编,链接整个进程。

但是平时运用Visual Studio等软件时并没有接触到这个进程,由于VS是高度集成开发环境(IDE、Integrated Development Environment),集成了代码编辑器,编译器,调试器和图像化用户界面,上述一切程序编译和链接进程都用一步build构建带过了。

GNU的GCC/G++

首要GNU是什么呢,GNU方案,又称革奴方案,是由Richard Stallman在1983年9月27日揭露建议的。它的方针是创立一套彻底自在的操作体系。由于其时1969年在贝尔实验室诞生的Unix是商业操作体系。

图片

而Stallman建议GNU方案的目的之一,便是”重现当年软件界合作互助的联合精力”,而为确保GNU软件能够自在地”运用、仿制、修正和发布”,一切GNU软件都有一份在制止其他人添加任何约束的情况下授权一切权力给任何人的协议条款,GNU通用公共许可证(GNU General Public License,GPL)。

看到这就知道了吧,Stallman便是开源运动的前驱。而他开始的方针”创立一套彻底自在的操作体系”也实现了,便是GNU/Linux,简称Linux!

GNU.jpg

Gnu英文乐意便是非洲牛羚,所以它的头像也是如此。

Linux 内核开始是由Linus Torvalds在赫尔辛基大学读书时出于个人爱好而编写的,第一版于1991年发布,其时仅1W行代码。1992年Linux与其他GNU软件结合(自然包括GCC) ,彻底自在的操作体系正式诞生。

图片

而Linux的logo,便是企鹅啦,由于根据国际公约,南极洲为全人类一起一切,不属于世界上的任何国家。Linux 挑选企鹅图画作为 Logo,代表了开放源代码的 Linux 为全人类一起一切。

此外,Linus Torvalds做出了全世界最大的程序员结交社区 GitHub(开源代码库及版本控制体系),因此无疑是这个世界上最巨大的程序员之一。

回到正题:GNU的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与clang不用解说应该也知道了。

LLVM是构架编译器(compiler)的结构体系,以C++编写而成,用于优化以任意程序言语编写的程序的编译时刻(compile-time)、链接时刻(link-time)、运转时刻(run-time)以及闲暇时刻(idle-time),对开发者坚持开放,并兼容已有脚本。

LLVM方案启动于2000年,开始由美国UIUC大学的Chris Lattner博士掌管开展。2006年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仍然有许多缺乏,比如

  1. make对于类unix体系是通用的,但对windows体系并不友好(不能跨渠道)
  2. make语法简略,也就导致了它功能的约束
  3. 不同编译器的语法规则不同,编写的makefile语法如果合适GCC则不合适MSVC

所以,CMake就应运而生啦。

CMake是比Make更高一层的工具,Make是编写对应编译器的makefile从而实现编译,而CMake是写一份独立的CmakeList.txt文件,然后该文件会根据当时体系环境挑选合适的构建生成器(如VS或许make),然后将CmakeList.txt翻译为合适的文件,再进一步调用体系编译器进行项目构建。

THE END

OK,到这儿咱们就捋完了从GCC到MSVC再到CMake这些名词啦,若文中有谬误,一定要指出哦。

了解Cpp:一个机械转码的机器视觉软件开发工程师