索引指南

  • 老生常谈
  • GNU的GCC/G++
  • Windows的Mingw/MSVC
  • LLVM的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博士主持开展。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翻译为适合的文件,再进一步调用系统编译器进行项目构建。

重要指令和CMake常用变量
CMake 编译工程

gcc、g++、MingW、MSVC、make、CMake的关系相关推荐

  1. Linux下gcc/g++、make和cmake的区别

    文本程序到可执行文件生成无论在什么平台大致分为以下几个部分:  1.用编辑器编写源代码,如.c文件.  2.用编译器编译代码生成目标文件,如.o.  3.用链接器连接目标代码生成可执行文件,如.exe ...

  2. Linux下 gcc/g++ 版本切换与CMake各版本安装

    一. gcc/g++ 版本切换 首先下载需要的版本(以gcc8为例) sudo apt-get install gcc-8 删除原有的gcc链接, 改为新链接 cd /usr/bin sudo rm ...

  3. gcc/g++/makefile/easymake/cmake/xmake/nmake ...

    最简单的Makefile,但是还是大程序少不了makefile工具 #CC=arm-linux-gnueabihf- CC= target:     $(CC)gcc -o algo_main alg ...

  4. MinGW下载并配置gcc/g++编译环境

    本文将讲解如何下载MinGW并配置gcc\g++编译环境 #方案一:官网下载 ##一.下载MinGW 在MinGW官网中下载"mingw-get-setup.exe" 官网传送门: ...

  5. 【Centos 使用rpm离线安装 make cmake gcc g++】

    Centos 使用rpm离线安装 make cmake gcc g++ 缺少 ld 安装 make 安装cmake 安装gcc g++ 参考 linux rpm 软件包地址 https://pkgs. ...

  6. 关于GCC Cygwin MinGW MSYS

    [转载]关于Gcc/MinGW/Cygwin/Msys http://blog.sciencenet.cn/blog-778757-616920.html 一.GCC的历史 GCC是一个原本用于Uni ...

  7. windows下,对opencv进行gcc/g++编译

    opencv官网下载的Windows安装包有source文件夹和build文件夹,其中build文件夹是已经编译好的,里面有用于VS配置的库,source文件夹包含源码和编译配置文件,可以借助cmak ...

  8. 【转】关于编译链接——gcc/g++

    添加运行时共享库目录 运行使用共享库的程序需要加载共享库(不同于G++ 编译时指定的链接库),添加共享库的步骤: 修改文件 /etc/ld.so.conf 添加共享库目录 运行 ldconfig 同步 ...

  9. Linux gcc/g++链接编译顺序详解

    gcc/g++链接时对库的顺序要求 -LdirAdd directory dir to the list of directories to be searched for -l. -llibrary ...

最新文章

  1. Android中Activity共享变量的另一方法:Application context
  2. Scrumban-拉动企业渐进式变革的利器
  3. 博图wincc连接数据块_西门子博途WINCC 可通过创建画面模板提高编程效率
  4. 从一个简洁的进度刻度绘制中了解自定义 View 的思路流程
  5. iOS开发内购图文教程
  6. ntfs安全权限和共享权限的区别
  7. 高中计算机课程打字网址,信息课
  8. 【知乎】中国是否适合发展纯电动汽车?
  9. android webview 弹出浏览器,android – 防止WebView打开浏览器
  10. HashMap 的底层源码分析
  11. 网页游戏脱机脚本制作视频教程
  12. ASP.NET Core MVC 入门到精通 - 1. 开发必备工具 (2021)
  13. python实现word内容替换
  14. SAP MM ME21N 创建PO时报错 - Net price in CNY becomes too large –
  15. ecshop清空购物车提醒,ecshop购物车,ecshop清空购物车,ecshop提醒信息,ecshop清空操作提示
  16. 云服务器如何重新装系统,云服务器可以重新安装系统
  17. 计算机硬盘无法启动怎么办,开机后硬盘无法引导怎么办
  18. rip/eip/rbp/ebp
  19. 2022单片机筑基教程
  20. JAVA巡云轻论坛系统源码

热门文章

  1. MixFormer目标跟踪CVPR2022(代码调试)
  2. flutter中使用android原生视图
  3. Rust Wasm 图片转 ASCII 艺术
  4. java计算机毕业设计ssm+vue红联小区果蔬销售网站-水果购物商城
  5. vi设计中视觉识别符号设计与商标设计的区别
  6. 无线蓝牙耳机什么牌子好?四大蓝牙耳机品牌推荐
  7. JavaScript DOM编程艺术简略笔记
  8. 《领域驱动设计-软件核心复杂性应对之道》阅读笔记(二)
  9. 海思多媒体(MPP)开发(10)——通道绑定
  10. Linux那点事儿——搭建本地yum仓库