赞
踩
GCC
是 GNU
编译器集合的意思, 对于用户能用的常用命令, 有 gcc
和 g++
.
无论是 gcc
还是 g++
, 他们的定位都是 driver
(驱动程序). driver
负责调用编译器(狭义), 把源码编译到汇编代码. 比如 C
语言的编译器(狭义)是 cc1
, 而 C++
语言的编译器(狭义)是 cc1plus
. driver
再调用 as
, 把汇编代码变成二进制代码. 最后调用 ld
, 负责把二进制代码拼在一起.
gcc
和 g++
的区别无非就是调用的编译器不同, 并且传递给链接器的参数不同.
具体而言 :
g++
会把 .c
文件当做是 C++
语言文件 (在 .c
文件前后分别加上 -xc++
和 -xnone
, 强制变成 C++
), 从而调用 cc1plus
进行编译;g++
遇到 .cpp
文件也会当做是 C++
, 调用 cc1plus
进行编译;g++
还会默认告诉链接器, 让它链接上 C++
标准库.gcc
会把 .c
文件当做是 C
语言文件, 从而调用 cc1
进行编译;gcc
遇到 .cpp
文件, 会当作是 C++
语言文件处理, 调用 cc1plus
进行编译;gcc
默认不会链接上 C++
标准库.driver
一般会根据文件后缀名确定它是什么语言. 下面这段 GCC
的源代码中, 就储存了文件后缀名和处理流程的默认对应关系. The default list of file name suffixes and their compilation specs.
因此我们可以使用 gfortran
编译 .c
文件而不会报错的;
目前网上最常见的误导性言论是说:
“gcc
会调用 g++
或者说 g++
会调用 gcc
”. X
其实 gcc
和 g++
都是 driver
, 实际上 gcc
遇到 .cpp
调用的是 cc1plus
, 就像 gcc
遇到 .d
文件会调用 d21
而不是 gdc
(也是 driver
), 遇到 .f
文件会调用 f951
而不是 gfortran
(也是 driver
) 一样.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。