1. GCC 与 gcc 的区别
GCC
(GNU Compiler Collection
)即 GNU
编译工具集,有编译器、链接器、组装器等,主要用来编译C
和 C++
语言,也可以编译 Objective-C
和 Objective-C++
程序。注意,这里的 GCC
是大写的,代表的是 GNU
编译工具集。
而 gcc
(GNU C Compiler
)(注意,这里是小写的)代表的是 GNU C
语言编译器;g++
代表的是GNU C++
语言编译器。但是从本质上讲,gcc
和 g++
并不是真正的编译器,它们也只是 GCC
里面的两个工具,在编译 C/C++
程序时,它们会调用真正的编译器对代码进行编译。可以简单地这样理解:gcc
工作的时候会调用 C
编译器;g++
工作的时候会调用 C++
编译器。
实际使用中我们更习惯使用 gcc
指令编译 C
语言程序,用 g++
指令编译 C++
代码。需要强调的一点是,这并不是 gcc
和 g++
的区别,gcc
指令也可以用来编译 C++
程序,同样 g++
指令也可以用于编译 C
语言程序。
2. gcc 与 g++ 区别
gcc
会将后缀为.c
的文件当作C
程序,将后缀为.cpp
的文件当作C++
程序;g++
会将后缀为.c
和.cpp
的都当成C++
程序;
因为 C
和 C++
语法上有一些区别,所以有时候通过 g++
编译的程序不一定能通过 gcc
编译。要注意的是,gcc
和 g++
都可以用来编译 C
和 C++
代码。
- 链接方式不同:
gcc
不会自动链接C++
库(比如STL
标准库),g++
会自动链接C++
库; - 预处理器宏不同:
g++
会自动添加一些预处理器宏,比如__cplusplus
,但是gcc
不会;
实际上,只要是 GCC
支持编译的程序代码,都可以使用 gcc
命令完成编译。可以这样理解,gcc
是 GCC
编译器的通用编译指令,因为根据程序文件的后缀名,gcc
指令可以自行判断出当前程序所用编程语言的类别,比如:
xxx.c
:默认以编译C
语言程序的方式编译此文件xxx.cpp
:默认以编译C++
程序的方式编译此文件xxx.m
:默认以编译Objective-C
程序的方式编译此文件xxx.go
:默认以编译Go
语言程序的方式编译此文件
当然,gcc
指令也为用户提供了 “手动指定代表编译方式” 的接口,即使用 -x
选项:
gcc -xc xxx
表示以编译C
语言代码的方式编译 xxx 文件gcc -xc++ xxx
则表示以编译C++
代码的方式编译 xxx 文件
但如果使用 g++
指令,则无论目标文件的后缀名是什么,该指令都一律按照编译 C++
代码的方式编译该文件。也就是说,
- 对于
.c
文件来说,gcc
指令以C
语言代码对待,g++
指令会以C++
代码对待。 - 但对于
.cpp
文件来说,gcc
和g++
都会以C++
代码的方式编译。
3. gcc 与 g++ 示例
C++
标准对代码书写规范的要求更加严格。
除此之外对于编译执行 C++
程序,使用 gcc
和 g++
也是有区别的。要知道,很多 C++
程序都会调用某些标准库中现有的函数或者类对象,而单纯的 gcc
命令是无法自动链接这些标准库文件的。举个例子:
//test.cpp
#include <iostream>
#include <string>
using namespace std;
int main(){
string str ="hello,world";
cout << str << endl;
return 0;
}
这是一段很简单的 C++
程序,其通过 <string>
头文件提供的 string
字符串类定义了一个字符串对象,随后使用 cout
输出流对象将其输出。对于这段 C++
代码,如果我们使用 g++
指令编译,如下所示:
[wohu@ubuntu~]$ g++ test.cpp
[wohu@ubuntu~]$
可以看到,整个编译过程没有报任何错误。但如果使用 gcc
指令:
[wohu@ubuntu~]$ gcc test.cpp
/tmp/ccluIPFx.o: In function `main':
test.cpp:(.text+0x20): undefined reference to `std::allocator<char>::allocator()'
....
/tmp/ccluIPFx.o:(.eh_frame+0x13): undefined reference to `__gxx_personality_v0'
collect2: error: ld returned 1 exit status
其根本原因就在于,该程序中使用了标准库 <iostream>
和 <string>
提供的类对象,而 gcc
默认是无法找到它们的。
如果想使用 gcc
指令来编译执行 C++
程序,需要在使用 gcc
指令时,手动为其添加 -lstdc++
选项,表示 gcc
在编译 C++
程序时可以链接必要的 C++
标准库。如下示例:
[wohu@ubuntu~]$ gcc test.cpp -lstdc++
[wohu@ubuntu~]$
由此,test.cpp 就被成功的编译了。
对于 gcc
和 g++
指令,还有其它更多细节方面的区别,当前只需要知道:
- 对于
C
语言程序的编译,我们应该使用gcc
指令 - 编译
C++
程序则推荐使用g++
指令
所以,如果要开发纯 C
语言的程序,可以使用 gcc
;如果要开发 C/C++
程序,而且还要使用 STL
标准库。为了开发的便利性,建议使用 g++
。