共计 3768 个字符,预计需要花费 10 分钟才能阅读完成。
回忆初学编程的时候,大部分人都是从 C 语言开始学起的,除了一些常见的语法和思维,一些基础知识经常被人们疏忽,如果没有及时地进行梳理,可能短时间内没有太大的影响,然而在日后碰到这些问题时仍旧一头雾水。例如 C 语言是一门编译型语言,编译型语言首先将源代码编译生成机器语言,再由机器运行机器码(二进制)。对于编译型语言,绕不过的就是编译器。
上面提出几个问题,无妨思考一下:
- 什么是 GNU
- 什么是 GCC / G++
- 什么是 MinGW-w64
- C++ 规范有哪些?次要区别是什么?
- Makefile 是什么?cmake 是什么?
如果脑海中没有一个整体的概念框架的话,正如那张图,一个全副武装的骑士,尽管防护的很好,然而对于编译器的基础知识把握的不牢,就像头盔上的一个缝隙,可能下一箭正中缝隙,败下阵来。
上面具体介绍这几个概念:
什么是 GNU
GNU 是一个打算或者叫静止。在这个旗号下成立了 FSF,起草了 GPL 等。
GNU 操作系统是一种由自由软件形成的类 Unix 操作系统,该零碎基于 Linux 内核,指标在于建设一个齐全相容于 UNIX 的自由软件环境。
过后 Unix 零碎开始免费和商业闭源了。针对这一景象,Richard Stallman 发动了 GNU 打算,模拟 Unix 的界面和应用形式,从头做一个开源的版本。他本人做了编辑器 Emacs 和编译器 GCC。接下来开发者实现了包含外围的 gcc 和 glibc。然而 GNU 零碎短少操作系统内核。原定的内核叫 HURD,始终完不成。同时 BSD(一种 UNIX 发行版)陷入版权纠纷,x86 平台开发暂停。这时 Linus 为了在 PC 上运行 Unix,在 Minix 的启发下,开发了 Linux。当然 Linux 只是一个零碎内核,系统启动之后应用的依然是 gcc 和 bash 等软件。Linus 在公布 Linux 的时候抉择了 GPL,因而合乎 GNU 的主旨。也补救了 GNU 在这方面的短少,于是合在一起打包公布叫 GNU / Linux。而后省掉了后面局部,变成了 Linux 零碎。实际上 Debian,RedHat 等 Linux 发行版中内核只占了很小一部分容量。
参考:https://www.gnu.org/gnu/gnu-linux-faq.html
什么是 GCC / G++
GCC(GNU 编译器套件):GNU Compiler Collection。能够编译 C、C++、JAVA、Fortran、Pascal、Object-C、Ada 等语言。
gcc / g++
gcc 是 GCC 中的 GNU C Compiler(C 编译器)
g++ 是 GCC 中的 GNU C++ Compiler(C++ 编译器)
编译的四个阶段
在具体的编译过程中,次要分为四个阶段:
- cpp(预处理器):c 语言 pre-proccessor。头文件开展,宏替换,正文去掉。hello.c 变成 hello.i
- ccl(编译器):c 语言 compile。C 文件变成汇编文件:hello.i 变成 hello.s
- as(汇编器):assembler。汇编文件变成可执行的二进制文件:hello.s 变成 hello.o
- ld(链接器):GNU Linker,loader。将函数库中相应的代码组合到指标文件中,汇编文件和零碎库文件链接起来,生成在特定平台可执行的程序。
最早的操作系统中,是没有链接器的,由加载器 loader 进行工作,所以 ld 的命名由此而来。
gcc 调用了 C compiler,而 g ++ 调用了 C ++ compiler
gcc 和 g ++ 的次要区别
- 对于 .c 和.cpp 文件,gcc 别离当做 c 和 cpp 文件编译(c 和 cpp 的语法强度是不一样的)
- 对于 .c 和.cpp 文件,g++ 则对立当做 cpp 文件编译
- 应用 g ++ 编译文件时,g++ 会主动链接规范库 STL,而 gcc 不会主动链接 STL
- gcc 在编译 C 文件时,可应用的预约义宏是比拟少的
- gcc 在编译 cpp 文件时 /g++ 在编译 c 文件和 cpp 文件时(这时候 gcc 和 g ++ 调用的都是 cpp 文件的编译器),会退出一些额定的宏。
- 在用 gcc 编译 c ++ 文件时,为了可能应用 STL,须要加参数 –lstdc++,但这并不代表 gcc –lstdc++ 和 g++ 等价,它们的区别不仅仅是这个
这里强推《深刻了解计算机系统》,CSAPP 这本书上解说的十分具体。
参考:GCC 的 gcc 和 g ++ 区别 – samewang – 博客园
MinGW-w64
MinGW 的全称是:Minimalist GNU on Windows。它实际上是将经典的开源 C 语言 编译器 GCC 移植到了 Windows 平台下,并且蕴含了 Win32API,因而能够将源代码编译为可在 Windows 中运行的可执行程序。简略来说,MinGW 就是 GCC 的 Windows 版本。
MinGW-w64 与 MinGW 的区别在于 MinGW 只能编译生成 32 位可执行程序,而 MinGW-w64 则能够编译生成 64 位 或 32 位 可执行程序。目前,MinGW 现已被 MinGW-w64 所取代,且 MinGW 也早已进行了更新。
MinGW-w64 是开源软件,能够收费应用。应用 Windows 的 C 语言运行库,因而编译出的程序不须要第三方 DLL,能够间接在 Windows 下运行。那些驰名的开源 IDE 理论只是将 MinGW-w64 封装了起来,使它领有敌对的图形化界面,简化了操作,但外部外围依然是 MinGW-w64。
C++ 语言版本
C++ 是一门以 C 为根底倒退而来的一门面向对象的高级程序设计语言,从 1983 年由 Bjarne Stroustrup 传授在贝尔实验室创建开始至今,已有 30 多个年头。C++ 从最后的 C with class,经验了从 C ++98、C++ 03、C++ 11、C++ 14、C++17 再到 C ++ 20 屡次标准化革新,性能失去了极大的丰盛,曾经演变为一门集面向过程、面向对象、函数式、泛型和元编程等多种编程范式的简单编程语言。
年份 | C++ 规范名称 | 非正式名称 |
---|---|---|
1998 | ISO/IEC 14882:1998 | C++98 |
2003 | ISO/IEC 14882:2003 | C++03 |
2011 | ISO/IEC 14882:2011 | C++11 |
2014 | ISO/IEC 14882:2014 | C++14 |
2017 | ISO/IEC 14882:2017 | C++17 |
2020 | ISO/IEC 14882:2020 | C++20 |
C++ 98
C++ 从最后的 C with Classes 新增了很多其余的个性,比方异样解决、模板、规范模板库(STL)、运行时异样解决(RTTI)与名字空间(Namespace)等。C++ 03 通常被认为是 98 的补丁。
C++ 11
C++ 引入了 对象挪动 、 右值援用 、lamba 表达式(函数式编程)、编译时类型辨认(auto)、 别名模板 以及很多新型关键词(如 nullptr、decltype、constexpr)等古代编程语言常具备的能力,让 C ++ 与时俱进,开发效率失去了很大的晋升。这些新的个性随着 C ++11 规范的公布而被正式确立下来。C++ 11 版本也被称为 古代 C ++,而 C ++ 98/03 版本也被称为 传统 C ++。此外还有 long long 的根本类型。新增容器std::unordered_map/std::unordered_multimap、std::unordered_set/std::unordered_multiset 等。
C++ 14
C++14 引入了二进制文字常量、将类型推导从 Lambda 函数扩大到所有函数、变量模板以及数字分位符等。进一步补充优化 C ++11。
C++ 17
到了 2017 年,C++ 迎来了 C ++17 规范。此次对 C ++ 的改良和扩增,让 C ++ 变得更加容易接受和便于应用了。C++17 引入了许多新的个性,比方类模板参数推导、UTF- 8 文字常量、fold 表达式、新类型以及新的库函数等。
C++ 20
C++20 的 Big Four(四大新个性:概念、范畴、协程和模块)以及外围语言(包含一些新的运算符和批示符)。
参考文章:C++ 版本发展史_c++ 历史版本_蓬莱道人的博客 -CSDN 博客
Makefile
一个工程中的源文件成千上万,其按类型、性能、模块别离放在若干个目录中,makefile 定义了一系列的规定来指定哪些文件须要先编译,哪些文件须要后编译,哪些文件须要从新编译,甚至于进行更简单的性能操作,因为 makefile 就像一个 Shell 脚本一样,也能够执行操作系统的命令。
make 是一个命令工具,它解释 Makefile 中的指令。在 Makefile 文件中形容了整个工程所有文件的编译程序、编译规定。Makefile 有本人的书写格局、关键字、函数。像 C 语言有本人的格局、关键字和函数一样。而且在 Makefile 中能够应用零碎 shell 所提供的任何命令来实现想要的工作。Makefile 在绝大多数的 IDE 开发环境中都在应用,譬如 Visual C++ 的 nmake、linux 下的 GNU make、Qt 的 qmake 等等。
cmake
不同的 IDE 所集成的 make 工具所遵循的标准和规范都不同,也就导致其语法、格局不同,也就不能很好的跨平台编译,会使得工作繁琐。那么 cmake 为了解决这个问题而诞生了,其容许开发者指定整个工程的编译流程,在依据编译平台,生成本地化的 Makefile 和工程文件,最初用户只需 make 编译即可。简而言之,能够把 cmake 看成一款主动生成 Makefile 的工具,所以编译流程就变成了:cmake—>make–> 用户代码–> 可执行文件