为什么使用“g++”而不是“gcc”来编译 *.cc 文件?

2023-11-23

我编译了一个使用的库g++代替gcc。一开始我以为源代码是用C++写的,后来发现*.cc文件里并没有任何C++代码。

为了确认这一点,我更换了g++在原始 makefile 中gcc。而且我仍然得到了正确的程序。

解释是什么?我不是第一次遇到这样的情况。


这取决于您在 makefile 中具体更改的内容。gcc / g++实际上只是一个前端驱动程序,它根据您提供的选项调用实际的编译器和/或链接器。

如果您将编译器调用为gcc:

  • it will compile根据文件扩展名作为 C 或 C++ (.c, or .cc / .cpp);
  • it will link与 C 一样,即它不会引入 C++ 库,除非您专门添加其他参数来执行此操作。

如果您将编译器调用为g++:

  • it will compile作为 C++,无论文件扩展名是否为.c or .cc / .cpp;
  • it will link作为 C++,即自动引入标准 C++ 库。

(see GCC 文档的相关部分).


这是一个简单的程序,用于检测它是否已编译为 C 或 C++。

(它利用了字符常量的大小为int在 C 语言中,或char在C++中。sizeof(char)根据定义为 1;sizeof(int)通常会更大 - 除非您使用的是 >= 16 位字节的模糊平台,但您可能不会。)

我已经这样称呼它了test.c并将其复制为test.cc还有:

File test.c

#include <stdio.h>

int main(void)
{
  printf("I was compiled as %s!\n", sizeof('a') == 1 ? "C++" : "C");
  return 0;
}

Copy

cp test.c test.cc

编译和链接test.c with gcc, and test.cc with g++,按预期工作:

$ gcc -o test test.c

$ ./test
I was compiled as C!

$ g++ -o test test.cc

$ ./test
I was compiled as C++!

编译和链接test.cc with gcc不起作用:它将代码编译为 C++,因为文件以.cc,但在链接阶段失败:

gcc -o test test.cc

Output:

/tmp/ccyb1he5.o:(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status

我们可以通过单独编译来证明gcc,并与g++(拉入正确的库):

$ gcc -c test.cc

$ g++ -o test test.o

$ ./test
I was compiled as C++!

...gcc将代码编译为 C++ 而不是 C,因为它有一个.cc文件扩展名。

Whereas g++ does not编译.c文件为普通 C:

$ g++ -o test test.c

$ ./test
I was compiled as C++!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么使用“g++”而不是“gcc”来编译 *.cc 文件? 的相关文章

随机推荐

  • 无 RDP 时自动发送密钥失败

    我有一个虚拟机 我希望在其上运行自动化任务 即自动化任务在实际虚拟机上运行 VM 是 Windows 2008 服务器 我已将该任务添加到任务计划程序中 当我通过 RDP 登录到计算机时 我可以通过右键单击 运行 来运行该任务 但是 当我的
  • switch语句:default必须是最后一种情况吗?

    考虑以下switch陈述 switch value case 1 return 1 default value fall through case 2 return value 2 该代码可以编译 但它对于 C90 C99 有效 定义的行为
  • 将大图像加载到位图中?

    我正在尝试制作一个显示来自相机的图像的基本应用程序 但是当我尝试使用 sdcard 加载 jpg 时BitmapFactory decodeFile 它返回 null 它不会给出我觉得奇怪的内存不足错误 但完全相同的代码在较小的图像上运行良
  • 文件名包含空格的 Shell 脚本问题

    我知道处理文件名中空格的一种技术是用单引号将文件名引起来 为什么下面的代码 echo sh 可以在包含带空格的文件名的目录上工作 但是程序 ls sh 却不起作用 唯一的区别是 echo 被 ls 替换了 echo sh bin sh fo
  • Mongoose 模型枚举的自定义错误消息

    我想自定义我的 Mongoose 模型生成的验证消息 我倾向于不直接将我的验证 例如必需的 放在模式对象上 因为没有自定义错误消息的自由 例如 sourceAccountId type Schema ObjectId require tru
  • 禁用“单页”网络应用程序的惯性滚动

    我正在尝试创建一个 单页 网络应用程序 其风格与 Gmail Google Docs Evernote 等相同 在这些应用程序中 允许惯性滚动拉动页面是没有意义的 这是我尝试禁用的效果的视频 http tinypic com r 2eb6f
  • AWS ec2 根卷增加:在 aws ubuntu 实例上扩展弹性根卷不起作用

    我已经关注了用于扩展弹性根卷的 aws 文档我的根卷大小从 8 GB 增加到 20 GB 我确认使用lsblk NAME MAJ MIN RM SIZE RO TYPE MOUNTPOINT xvda 202 0 0 20G 0 disk
  • 将 xtable 输出拆分为子表

    有一个关于在有多列时将 xtable 与 Sweave 一起使用的问题 我正在处理的表格大约有 25 列和 5 行 确切的列数未知 因为它是动态的 当我跑步时说 表 1 我得到的表格基本上超过了页面长度 ColA ColB ColC Row
  • XCHG 在 Intel 汇编语言中如何工作?

    如何xchg以下代码中的指令工作 已知arrayD是一个 DWORD 数组 1 2 3 mov eax arrayD eax 1 xchg eax arrayD 4 eax 2 arrayD 2 1 3 为什么后面不是数组 1 1 3xch
  • 正则表达式匹配单个点而不是两个点?

    尝试创建用于电子邮件地址检查的正则表达式模式 这将允许使用点 但如果有多个点相邻 则不允许使用点 应匹配 电子邮件受保护 不应该匹配 电子邮件受保护 现在我知道互联网上有数千个用于电子邮件匹配的示例 因此请不要向我发布包含完整解决方案的链接
  • Matlab - save(int2str(i), x) 不起作用 - 参数必须包含字符串

    我有一个循环正在生成一些数据 在某些情况下我想保存数据 因此我有 save int2str i x 这不起作用并显示以下消息 Error using gt save Argument must contain a string 我究竟做错了
  • 无法 Dockerize Vite React-Typescript 项目

    我正在尝试对 Vite React Typescript 样板设置进行 dockerize 但无法连接到容器 安装了 vite react typescript 样板 npm init vite latest vite docker dem
  • 返回 http 200 OK,响应正文中有错误

    我想知道返回是否正确HTTP 200 OK当服务器端发生错误时 错误详细信息将包含在响应正文中 Example 我们正在发送HTTP GET 服务器端发生了一些意想不到的事情 服务器返回HTTP 200 OK响应中存在错误的状态代码 例如
  • 如何通过给出私钥获得RSA公钥?

    我正在寻找一个 Java 函数 它将获取 RSA 私钥并返回正确的 RSA 公钥 或者 是否有一个函数可以告诉我们 RSA 私钥 公钥是否有效 如果您有私钥作为RSA私钥对象 您可以获得公共指数以及模数 然后你可以像这样创建公钥 RSAPu
  • 如何在 django 的 ModelForm 中使用 DatePicker?

    我正在使用 django 3 0 我试图在我的 ModelForm 中显示一个日期选择器小部件 但我不知道如何 我能得到的只是文本字段 我尝试寻找一些解决方案 但找不到任何解决方案 这就是我的模型和 ModelForm 的样子 class
  • 在 AngularJS 自定义验证指令中调用异步服务

    我有一个自定义验证指令 验证用户名尚不存在 验证使用 http服务询问服务器用户名是否存在 因此返回的是一个promise对象 这对于验证来说非常有效 当用户名已被使用时 表单无效并包含 myform error usernameVerif
  • 如何将 Angular Promise 转换为 jquery 延迟对象

    我想将承诺从我的模块 sdk 返回到非角度 javascript 例如 如果我将 Promise 返回给 jquery 我可能应该发送 jquery 延迟对象 如何将 Angular Promise 转换为 jquery Promise D
  • Xcode 6 iPhone 模拟器应用程序支持位置

    在 Xcode 6 中 我有一个正在使用 Core Data 的应用程序 但 iOS 8 iPhone 模拟器的应用程序支持中没有文件夹 我的文件和 Core Data sqlite 数据库存储在哪里 模拟器目录已随 Xcode 6 bet
  • 操作栏 Sherlock SearchView 单击时不会展开

    我有一个 Sherlock 片段活动 我使用片段寻呼机适配器从中设置不同的 Sherlock 片段 现在 为了在每个片段中显示搜索视图 我已将此方法放置在片段的 onCreate 中 此方法将在片段的 ActionBar 中显示菜单项 Ov
  • 为什么使用“g++”而不是“gcc”来编译 *.cc 文件?

    我编译了一个使用的库g 代替gcc 一开始我以为源代码是用C 写的 后来发现 cc文件里并没有任何C 代码 为了确认这一点 我更换了g 在原始 makefile 中gcc 而且我仍然得到了正确的程序 解释是什么 我不是第一次遇到这样的情况