凡亿教育-婷婷
凡事用心,一起进步
打开APP
公司名片
凡亿专栏 | 编译工具:gcc,GNU,MinGW,MSVC,make、cmake,Ninja
编译工具:gcc,GNU,MinGW,MSVC,make、cmake,Ninja

1. 从Hello World说起:程序是怎么变成可执行文件的?

让我们从一个最简单的C程序开始:

30df53d16eebf10b8333f5067b502f.jpg

在Linux上,要让这段代码运行,我们需要用GCC把它变成机器能执行的程序。这个过程分为4步:

  1. 预编译(hello.c → hello.i):处理#include等预处理指令

  2. 编译(hello.i → hello.s):生成汇编代码

  3. 汇编(hello.s → hello.o):生成机器码(目标文件)

  4. 链接(hello.o → hello):把目标文件和库合并成可执行文件

用GCC可以一键完成:

5945cd832d13d0f9667164b67a5e99.jpg

但在Windows的Visual Studio里,你只需要点"Build"按钮——因为VS是IDE,它把编译器、构建工具、调试器都打包好了,隐藏了这些细节。

2. GNU和GCC:自由软件运动的基石GNU是什么?

  • 全称"GNU's Not Unix"(递归缩写),由Richard Stallman在1983年发起

  • 目标:创建一个完全自由的操作系统(后来和Linux内核结合成了GNU/Linux)

  • 精神:"软件应该自由使用、修改和分享"(GPL协议)

a49d1215991c1da245b75f231578a8.jpg

(GNU的logo是非洲牛羚,象征自由奔跑)

GCC又是什么?

  • GNU Compiler Collection(GNU编译器集合)

  • 支持C、C  、Fortran等多种语言

  • Linux的默认编译器,也是开源世界的编译标准

01144a28893c4f24073b9e671668df.jpg

3. Windows下的编译选择:MinGW vs MSVCMinGW:GCC的Windows版

  • 全称:Minimalist GNU for Windows

  • 特点:

    • 把GCC移植到Windows

    • 生成原生.exe,不依赖额外DLL

    • 开源免费(Qt、GTK等常用它)

793d40c6ce841257e4bba7d9d3379a.jpg

MSVC:微软的亲儿子

  • Microsoft Visual C  ,集成在Visual Studio里

  • 特点:

    • Windows兼容性最佳

    • 闭源但免费(社区版)

    • 和Windows SDK深度绑定

f84d13a6292112b154c5df4078da42.jpg
MinGW (GCC)MSVC出身GNU开源微软官方速度中等优化较好生态跨平台Windows专属4. 为什么需要构建工具?从Make到NinjaMake:最早的"智能批处理"

  • 问题:当项目有a.c、b.c、lib.c...时,手动敲gcc命令太麻烦

  • 解决:用Makefile定义规则

07d3b02f79b2cd1ff854bb0ab07368.jpg3c46ccfc568743475cfac6c13389da.jpg

CMake:跨平台的Makefile生成器

  • 新问题:不同平台要写不同的Makefile(Windows用nmake,Linux用make...)

  • 解决:用CMake生成对应平台的构建文件

3ba918bc6d7050d745961356b5d8f9.jpg

生成Makefile:

69dd070fdf27491b8abebb670d3d45.jpg

Ninja:Google出品,唯快不破

  • 专为超大型项目优化(如Chrome、LLVM)

  • 比Make快10倍(30000个文件1秒启动编译)

  • 通常由CMake自动生成build.ninja

4d6443736b333fa67b05dd7ac1e8d5.jpg

5. 现代C/C  开发工具链推荐场景推荐工具链Linux开发GCC   CMake   NinjaWindows原生开发MSVC   Visual Studio跨平台项目MinGW/Clang   CMake   Ninja超大型项目Clang   CMake   Ninja总结:一张图理清关系

eaaa443ff2f5a4c6ad149c124d50b1.jpg

关键记忆点:

  • GCC是开源编译器,MSVC是微软的

  • Make老当益壮,Ninja后来居上

  • CMake不是编译器,是"生成构建文件的工具"

现在你可以自信地和undefined reference错误大战三百回合了!



声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表凡亿课堂立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。
相关阅读
进入分区查看更多精彩内容>
精彩评论

暂无评论