gcc 和 g++ 的联系和区别,使用 gcc 编译 c++

1. GCC 与 gcc 的区别

GCCGNU Compiler Collection)即 GNU 编译工具集,有编译器、链接器、组装器等,主要用来编译CC++ 语言,也可以编译 Objective-CObjective-C++ 程序。注意,这里的 GCC 是大写的,代表的是 GNU 编译工具集。

gccGNU C Compiler)(注意,这里是小写的)代表的是 GNU C 语言编译器;g++ 代表的是GNU C++ 语言编译器。但是从本质上讲,gccg++ 并不是真正的编译器,它们也只是 GCC 里面的两个工具,在编译 C/C++ 程序时,它们会调用真正的编译器对代码进行编译。可以简单地这样理解:gcc 工作的时候会调用 C 编译器;g++ 工作的时候会调用 C++ 编译器。

实际使用中我们更习惯使用 gcc 指令编译 C 语言程序,用 g++ 指令编译 C++ 代码。需要强调的一点是,这并不是 gccg++ 的区别,gcc 指令也可以用来编译 C++ 程序,同样 g++ 指令也可以用于编译 C 语言程序。

2. gcc 与 g++ 区别

  • gcc 会将后缀为 .c 的文件当作 C 程序,将后缀为 .cpp 的文件当作 C++ 程序;
  • g++ 会将后缀为 .c.cpp 的都当成 C++ 程序;

因为 CC++ 语法上有一些区别,所以有时候通过 g++ 编译的程序不一定能通过 gcc 编译。要注意的是,gccg++ 都可以用来编译 CC++ 代码。

  • 链接方式不同:gcc 不会自动链接 C++ 库(比如 STL 标准库),g++ 会自动链接 C++ 库;
  • 预处理器宏不同:g++ 会自动添加一些预处理器宏,比如 __cplusplus ,但是 gcc 不会;

实际上,只要是 GCC 支持编译的程序代码,都可以使用 gcc 命令完成编译。可以这样理解,gccGCC 编译器的通用编译指令,因为根据程序文件的后缀名,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 文件来说,gccg++ 都会以 C++ 代码的方式编译。

3. gcc 与 g++ 示例

C++ 标准对代码书写规范的要求更加严格。

除此之外对于编译执行 C++ 程序,使用 gccg++ 也是有区别的。要知道,很多 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 就被成功的编译了。

对于 gccg++ 指令,还有其它更多细节方面的区别,当前只需要知道:

  • 对于 C 语言程序的编译,我们应该使用 gcc 指令
  • 编译 C++ 程序则推荐使用 g++ 指令

所以,如果要开发纯 C 语言的程序,可以使用 gcc;如果要开发 C/C++ 程序,而且还要使用 STL标准库。为了开发的便利性,建议使用 g++

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wohu007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值