g++和gcc的误区




gcc和g++都是GNU(组织)的一个编译器。

误区一:gcc只能编译c代码,g++只能编译c++代码
两者都可以,但是请注意:
1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。C++的语法规则更加严谨一些。
2.编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为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,二者等价。

gcc和g++的区别
我们在编译c/c++代码的时候,有人用gcc,有人用g++,于是各种说法都来了,譬如c代码用gcc,而c++代码用g++,或者说编译用 gcc,链接用g++,一时也不知哪个说法正确,如果再遇上个extern "C",分歧就更多了,这里我想作个了结,毕竟知识的目的是令人更清醒,而不是更糊涂。
 
误区一:gcc只能编译c代码,g++只能编译c++代码

两者都可以,但是请注意:
1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的,例如:
#include <stdio.h>
int main(int argc, char* argv[]) {
   if(argv == 0) return;
   printString( argv);
   return;
}
int printString(char* string) {
  sprintf(string, "This is a test./n");
}
如果按照C的语法规则,OK,没问题,但是,一旦把后缀改为cpp,立刻报三个错:“printString未定义”;
“cannot convert `char**' to `char*”;
”return-statement with no value“;
分别对应前面红色标注的部分。可见C++的语法规则更加严谨一些。
2.编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为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,二者等价。
 
误区四:extern "C"与gcc/g++有关系

实际上并无关系,无论是gcc还是g++,用extern "c"时,都是以C的命名方式来为symbol命名,否则,都以c++方式命名。试验如下:
me.h
extern "C" void CppPrintf(void);
 
me.cpp:
#include <iostream>
#include "me.h"
using namespace std;
void CppPrintf(void)
{
     cout << "Hello/n";
}
 
test.cpp:
#include <stdlib.h>
#include <stdio.h>
#include "me.h"        
int main(void)
{
    CppPrintf();
    return 0;
}
 
1. 先给me.h加上extern "C",看用gcc和g++命名有什么不同

[root@root G++]# g++ -S me.cpp
[root@root G++]# less me.s
.globl _Z9CppPrintfv        //注意此函数的命名
        .type   CppPrintf, @function
[root@root GCC]# gcc -S me.cpp
[root@root GCC]# less me.s
.globl _Z9CppPrintfv        //注意此函数的命名
        .type   CppPrintf, @function
完全相同!
               
2. 去掉me.h中extern "C",看用gcc和g++命名有什么不同

[root@root GCC]# gcc -S me.cpp
[root@root GCC]# less me.s
.globl _Z9CppPrintfv        //注意此函数的命名
        .type   _Z9CppPrintfv, @function
[root@root G++]# g++ -S me.cpp
[root@root G++]# less me.s
.globl _Z9CppPrintfv        //注意此函数的命名
        .type   _Z9CppPrintfv, @function
完全相同!
【结论】完全相同,可见extern "C"与采用gcc/g++并无关系,以上的试验还间接的印证了前面的说法:在编译阶段,g++是调用gcc的。
 
### 如何在64位系统上安装 g++ gcc #### 安装环境概述 对于64位操作系统而言,安装 `gcc` `g++` 是开发 C/C++ 应用程序的基础步骤。这些编译器可以通过多种方式获取并安装到不同的 Linux 发行版中。 --- #### 在 Ubuntu 系统上的安装方法 如果目标平台是基于 Ubuntu 的发行版,则可以按照以下方式进行操作: 1. **更新软件源** 首先需要确保系统的包管理器是最新的,这一步通过运行命令完成: ```bash sudo apt update && sudo apt upgrade -y ``` 2. **安装 GCC G++ 编译器** 接下来可以直接利用 APT 工具来安装最新版本的 GCC G++ 编译器: ```bash sudo apt install build-essential ``` 这条指令会自动拉取必要的构建工具以及 GCC G++ 编译器[^4]。 3. **验证安装成功与否** 可以分别执行如下两条命令确认它们已经正确安装: ```bash gcc --version g++ --version ``` --- #### 在 Debian 11 上的具体安装流程 当面对的是 Debian 11 平台时,可能还需要额外配置才能获得指定版本的 GCC 或者 G++ 编译器: 1. **添加旧版本存储库支持** 如果希望安装较老版本(比如 GCC-5),则需启用相应的组件: ```bash echo 'deb http://deb.debian.org/debian bullseye main' | sudo tee /etc/apt/sources.list.d/bullseye-backports.list sudo apt-get update ``` 2. **实际安装过程** 使用下面这条语句即可实现特定版本的安装需求: ```bash sudo apt-get install gcc-5 g++-5 ``` 此外还需注意调整默认使用的编译器版本号以便匹配预期设置[^2]。 3. **切换默认版本** 若要更改当前活动中的 GCC/G++ 到刚装好的那个版本,可借助 `update-alternatives` 命令完成: ```bash sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 50 sudo update-alternatives --config gcc sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 50 sudo update-alternatives --config g++ ``` --- #### 对于无网络连接情况下的解决方案 假如处于完全隔离环境下无法在线下载资源文件的话,那么就需要提前准备好对应的离线安装包来进行部署工作了。 1. **获取所需材料** 访问公开托管站点如 [GitCode](https://gitcode.com/) 下载预打包镜像文件[^3]。 2. **传输至目标机器** 将上述资料拷贝进入待处理主机内部硬盘当中去。 3. **解压与注册路径变量** 解压缩之后记得把相应目录加入 PATH 中使得全局可见: ```bash export PATH=/path/to/offline/gcc:$PATH source ~/.bashrc ``` --- ```python print("Gcc and G++ installed successfully!") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值