linux、GNU、GNU/linux
什么是Linux
- Linux OS的内核的名字也“Linux”
- 最初为i386设计
- Linux内核支持从PC到大型主机
- 和其他的商用Unix系统
- Windows相比,
- 自由软件Linux有低成本,安全性高,可信赖
- Linux内核最初Linus Torvald
- 最初Linux是一种类似Minix这样的一种操作系统。
- Linux的历史是和GNU紧密联系
- 83年开始的GNU计划致力于开发一个自由且完整的类Unix操作系统,
- 91年Linux内核发布时,
- 开发人员的努力下,GNU组件可运行于Linux内核上。
- 整个内核是基于GNU通用公共许可,
- 也就是GPL(General Pubic License)的,
- Linux内核并不是GNU 计划的一部分。
- Linux的标志和吉祥物是一只名字叫做Tux的企鹅,
- Linux的注册商标是Linus Torvalds所有
- Linux的某些版本不需安装就能使用的,称LiveCD
什么是GNU
- 革奴计划,Richard Stallman在83年9月27日发起
- 目标是创建一套完全自由的操作系统
- GNU是“GNU’s Not Unix”的递归缩写。
- Stallman宣布GNU应当发音为Guh-NOO,与canoe发音相同,以避免与gnu(非洲牛羚,发音与new相同)这个单词混淆。
- UNIX是一种广泛使用的商业操作系统的名称。
- GNU将要实现UNIX系统的接口标准,
- 因此GNU计划可分别开发不同的操作系统部件。
- GNU计划采用了部分当时已经可自由使用的软件,例如TeX排版系统和X Window视窗系统等。
- 不过GNU计划也开发了大批其他的自由软件。
- 为保证GNU软件可自由地“使用、复制、修改和发布”,
- 所有GNU软件都在一份在禁止其他人添加任何限制的情况下授权所有权利给任何人的协议条款,GNU通用公共许可证(GNU General Public License,GPL)。
- 这个就是被称为“反版权”(或称Copyleft)的概念。
- 85年Richard Stallman又创立自由软件基金会(Free Software Foundation)来为GNU计划提供技术、法律以及财政支持。
- 尽管GNU计划大部分时候是由个人自愿无偿贡献,但FSF有时还是会聘请程序员帮助编写。
- 当GNU计划逐渐获得成功时,一些商业公司开始介入开发和技术支持。
- 最著名的就是之后被Red Hat兼并的Cygnus Solutions。
- 到1990年,GNU计划开发出的软件包括一个功能强大的文字编辑器Emacs,C语言编译器GCC,大部分UNIX系统的程序库和工具。
- 唯一没有完成的重要组件就是操作系统的内核(称为HURD)。
- 91年Torvalds编写出与UNIX兼容的Linux操作系统内核并在GPL条款下发布。
- Linux之后在网上广泛流传,许多程序员参与了开发与修改。
- 92年Linux与其他GNU软件结合,完全自由的操作系统正式诞生。
- 尽管如此GNU计划自己的内核Hurd依然在开发中,目前已经发布Beta版本。
- 许多UNIX系统上也安装了GNU软件,因为GNU软件的质量比之前UNIX的软件还要好。
- GNU工具还被广泛地移植到Windows和Mac OS
GNU/Linux是什么玩意儿
- Linux只是一个操作系统内核
- GNU提供大量的自由软件来丰富在其之上各种应用程序
- Linux这个词本身只表示Linux内核,但实际上人们已习惯用Linux来形容整个基于Linux内核,且用GNU工程各种工具和数据库的操作系统。
- 基于这些组件的Linux软件被称为Linux发行版
- 一个Linux发行套件包含大量的软件,如软件开发工具,数据库,Web服务器(例如Apache),X Window,桌面环境(比如GNOME和KDE),办公套件(如OpenOffice.org
- 大多数基于Linux内核的操作系统使用了大量GNU软件
- 包括一个shell程序、工具、程序库、编译器及工具,
- 还有许多其他,如Emacs。
- 由于Linux用了许多GNU程序,
- Richard Stallman提议将Linux操作系统改为GNU/Linux。
- 但有些人只把操作系统叫做"Linux"
- 有部分Linux套件,包括了Debian,采用“GNU/Linux”
- 大多数商业Linux套件依然将操作系统称Linux
- “操作系统”一词指的应该只是系统内核,
- 其他程序都只能算是应用软件,
- 该操作系统的内核应叫Linux,
- 而Linux套件是在Linux内核的基础上加入各种GNU工具
- 拒绝用“GNU/Linux”作的人:
- Linux名字短好记
- Richard Stallman直到90年代中期,Linux流行后才要求更名
参考链接
- https://www.cnblogs.com/nerrissa/articles/5613739.html
三大区别
- GCC全称 GNU C Compiler, 最早的时候就是一个c编译器。
- 后来这个项目里边集成了更多其他不同语言的编译器,
- GCC就代表 the GNU Compiler Collection,一堆编译器合集。
有一篇
- GCC:GNU Compiler Collection,它可编译C、C++、JAV、Fortran、Pascal、Object-C、Ada
- gcc是GCC中的GUN C Compiler(C 编译器)
- g++是GCC中的GUN C++ Compiler(C++编译器)
-
gcc和g++并不是编译器,也不是编译器的集合,只是一种驱动器,
-
根据参数中要编译的文件的类型,调用对应的GUN编译器
-
gcc编译一个c文件的话,以下几步:
-
Step1:Call a preprocessor, like cpp.
-
Step2:Call an actual compiler, like cc or cc1.
-
Step3:Call an assembler, like as.
-
Step4:Call a linker, like ld
-
编译器是可更换的,所以gcc不仅仅可以编译C文件
-
更准确: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文件的编译器),会加入一些额外宏
#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern 6
- 用gcc编译c++时,为能用STL,需加参数–lstdc++ ,这并不代表 gcc –lstdc++ 和 g++等价
- gcc可以用来编译c++但它不会自动调用链接的c++库,需手动链接,
- gcc -lstdc++ main.cpp。g++则会自动调用链接的c++库。
- g++在编译的过程中,其实是调用gcc按照c++程序来编译的。即编译工作最终都是由gcc来完成的。
- 对于c++程序,gcc不能自动和C++程序使用的库联接,需要自己手动链接c++库,所以链接可以用g++或者gcc -lstdc++。也即是说c++程序,也可以用gcc来链接。
- 但gcc在编译c程序的时候,它会自动链接c库的。
- 误区:gcc只能编译c代码,g++只能编译c++代码
- .c的,gcc把它当作是C程序,而g++当作是c++程序
- .cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。C++的语法规则更加严谨一些。
- 编译阶段,g++会调用gcc。对c++,可以用gcc或g++来编译,二者等价的。
- 链接阶段,因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接。一般为了方便,干脆编译和链接都用g++了。这就给人一种错觉,好像cpp程序只能用g++编译链接似的。
- 误区:gcc不会定义__cplusplus宏,而g++会
- 这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采用gcc编译器,则该宏就是未定义的,否则,就是已定义。
- 误区:编译只能用gcc,链接只能用g++
- 应该这样说:编译可以用gcc/g++,而链接可以用g++或者gcc -lstdc++。gcc不能自动和C++程序使用的库联接,所以通常使用g++来完成联接。但在编译阶段,g++会自动调用gcc,二者等价。
chao网址
- https://blog.csdn.net/p942005405/article/details/83061693
STL
- “Standard Template Library”
- STL 是 C++ 标准库的一部分,不用单独安装。
- C++ 对模板(Template)支持得很好,STL 就是借助模板把常用的数据结构及其算法都实现了一遍,做到了数据结构和算法的分离。
- vector 的底层为顺序表(数组),
- list 的底层为双向链表,
- deque 的底层为循环队列,
- set 的底层为红黑树,
- hash_set 的底层为哈希表。
链接
- http://c.biancheng.net/stl/