快捷搜索: 王者荣耀 脱发

gcc、g++、MingW、MSVC、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博士主持开展。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翻译为适合的文件,再进一步调用系统编译器进行项目构建。

经验分享 程序员 微信小程序 职场和发展