cc、gcc、g++、CC的区别概括 /bin/bash cc 命令找不到

本文详细解析了GCC(GNU Compiler Collection)与G++(C++编译器)在Linux环境下的功能差异、使用场景以及注意事项。重点讨论了两者之间的联系与区别,包括如何通过符号链接实现跨语言程序的兼容性,以及如何正确使用这些编译器进行C和C++程序的编译与链接。文章旨在帮助开发者理解并有效利用GCC和G++的强大功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

gcc是C编译器;g++是C++编译器;linux下cc一般是一个符号连接,指向gcc;gcc和g++都是GUN(组织)的编译器。而CC则一般是makefile里面的一个名字,即宏定义,嘿,因为Linux/Unix都是大小写敏感的系统,这点一定要注意。

cc是Unix系统的C Compiler,而gcc则是GNU Compiler Collection,GNU编译器套装。gcc原名为Gun C语言编译器,因为它原本只能处理C语言,但gcc很快地扩展,包含很多编译器(C、C++、Objective-C、Ada、Fortran、Java)。因此,它们是不一样的,一个是古老的C编译器,一个是GNU编译器集合,gcc里面的C编译器比cc强大多了,因此没必要用cc。

下载不到cc的原因在于:cc来自于昂贵的Unix系统,cc是商业软件。

Linux下的cc是gcc符号连接,可以通过$ls –l /usr/bin/cc来简单察看,该变量是make程序的内建变量,默认指向gcc。cc符号链接和变量存在的意义在于源码的移植性,可以方便的用gcc来编译老的用cc编译的Unix软件,甚至连makefile都不用改在,而且也便于Linux程序在Unix下编译。

 

误区一: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,二者等价。

 

C++的编译器肯定可以编译C的代码,注意除了C++对C的语法扩充之外,编译和链接C和C++的标准库通常也不一样呢,用gcc而非g++也编译了C++的程序就证明了这一点。

 

注:符号链接是一种特殊类型的文件,它的内容只是一个字符串。它可能指向一个存在的文件也可能什么都不指向。当您在命令行或程序里提到符号链接的时候,您实际上进入了它指向的文件,前提是这个文件是存在的。


所有有时候你会遇到问题 cc 命令找不到,那是你要做一个软链接 将cc 指向 gcc 来编译makefile


<think>好的,我现在需要解释用户提供的两条`update-alternatives`命令的含义和作用。首先,用户之前已经询问过如何在Ubuntu 22.04中管理多个GCC版本,现在他们想具体了解这两条命令的细节。 首先,我应该回忆一下`update-alternatives`的作用。这个工具用于管理系统中同一个命令的多个版本,允许用户切换不同的实现。例如,系统中可能有多个版本的GCC,用户可以通过这个工具设置默认使用哪个版本。 接下来,看看具体的命令结构。第一条命令是: ```bash sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 110 --slave /usr/bin/g++ g++ /usr/bin/g++-11 ``` 第二条类似,只是版本号和优先级不同: ```bash sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 120 --slave /usr/bin/g++ g++ /usr/bin/g++-12 ``` 需要分解每个参数的含义。`--install`选项用于添加一个新的候选项。参数的结构通常是: ``` install <链接> <名称> <路径> <优先级> [--slave <链接> <名称> <路径>]... ``` 这里,链接是符号链接的路径,名称是alternatives组的名称,路径是实际的可执行文件路径,优先级是一个数值,决定默认选择哪个版本(数值高的优先)。 在第一条命令中,主条目是`/usr/bin/gcc`,属于名为`gcc`的组,指向`/usr/bin/gcc-11`,优先级为110。同时,`--slave`指定了从属条目,即当主条目切换时,从属条目也会自动切换。这里,`g++`作为从属,指向`g++-11`。 第二条命令同理,但指向gcc-12和g++-12,优先级120更高,所以默认可能选择这个版本。 用户可能想知道这些命令的作用,即它们如何将多个GCC版本注册到alternatives系统中,从而允许通过`update-alternatives --config gcc`来交互式切换。同时,主从关系确保gcc和g++版本同步切换,避免混用不同版本的编译器和C++编译器。 可能需要进一步解释优先级的作用,比如当自动模式时,系统会选择优先级高的版本作为默认。手动切换后,则忽略优先级。 此外,需要提醒用户,安装alternatives后,需要使用`--config`来选择版本,否则可能保持自动模式下的最高优先级版本。 还要确认命令的正确性,例如路径是否正确存在,是否已安装对应的gcc-11和gcc-12包,否则符号链接可能无效。 总结来说,这两条命令的作用是向系统中注册两个GCC版本(11和12),并设置它们的优先级,使得用户可以通过alternatives系统方便地切换,同时保持gcc和g++的版本一致。</think>以下是对这两条命令的详细解析: ### 命令结构分解 ```bash sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 110 \ --slave /usr/bin/g++ g++ /usr/bin/g++-11 ``` #### 参数逐项说明: 1. **`--install`** 表示要注册一个新的备选方案 2. **`/usr/bin/gcc`** 系统默认调用的符号链接路径(最终会被指向实际版本) 3. **`gcc`** 这个备选方案组的名称(用于后续管理) 4. **`/usr/bin/gcc-11`** 实际编译器二进制文件路径 5. **`110`** 优先级数值(数值越大越优先自动选择) 6. **`--slave`** 部分 定义关联的从属命令(必须与主命令配套切换) ### 命令作用图示 $$ \begin{array}{ccc} \text{用户调用} & \rightarrow & \text{符号链接} \\ gcc/g++ & \rightarrow & /usr/bin/gcc \\ & & \downarrow \\ & & \text{alternatives系统} \\ & & \swarrow \quad \searrow \\ \text{实际版本} & gcc-11 & gcc-12 \\ & g++-11 & g++-12 \\ \end{array} $$ ### 核心功能 1. **版本注册** 将 GCC 11 和 GCC 12 注册到系统的备选管理体系中 2. **优先级控制** - GCC 12 的优先级 120 > GCC 11 的 110 - 意味着在自动模式下,系统默认选择 GCC 12 3. **主从绑定** 保证 `gcc` 和 `g++` 版本同步切换(C/C++ 编译器版本一致) ### 典型应用场景 1. 当执行 `sudo update-alternatives --config gcc` 时: ```bash # 会出现交互选择菜单 There are 2 choices for the alternative gcc... Selection Path Priority Status ---------------------------------------------------- * 0 /usr/bin/gcc-12 120 auto mode 1 /usr/bin/gcc-11 110 manual mode 2 /usr/bin/gcc-12 120 manual mode ``` 2. 选择后产生的效果: - `/usr/bin/gcc` → 指向所选版本的二进制文件 - `/usr/bin/g++` → 自动同步指向对应版本 ### 注意事项 1. **路径验证** 需要确保 `/usr/bin/gcc-11` 和 `/usr/bin/gcc-12` 实际存在(通过 `which gcc-11` 验证) 2. **依赖关系** 使用前必须已通过 `apt install gcc-11 g++-11` 等命令安装对应版本 3. **范围限制** 该配置仅影响通过 `gcc/g++` 命令直接调用的情况,显式调用 `gcc-11` 或 `gcc-12` 不受影响 ### 扩展应用 通过以下命令可以查看当前所有注册的编译器版本: ```bash update-alternatives --list gcc ``` 输出示例: ``` /usr/bin/gcc-11 /usr/bin/gcc-12 ``` 这种管理方式为开发者提供了灵活的环境配置能力,是处理多版本编译需求的标准方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值