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

标签 linux gcc g++ compilation

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

为了证实这一点,我用 gcc 替换了原始 makefile 中的 g++。而且我仍然得到了正确的程序。

谁能解释一下?我不是第一次遇到这种情况。

最佳答案

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

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

  • 它将根据文件扩展名(.c.cc/.cpp< 将 编译 为 C 或 C++/);
  • 它将链接为 C,即它不会引入 C++ 库,除非您为此专门添加额外的参数。

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

  • 无论文件扩展名是 .c 还是 .cc/.cpp<,它都会编译为 C++/;
  • 它将链接为 C++,即自动引入标准 C++ 库。

(参见 the relevant bit of the GCC documentation)。


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

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

我将其命名为 test.c 并将其复制为 test.cc:

$ cat test.c
#include <stdio.h>

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

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

$ gcc -o test test.c
$ ./test
I was compiled as C!
$ g++ -o test test.cc
$ ./test
I was compiled as C++!
$ 

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

$ gcc -o test test.cc
/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 文件扩展名。

g++ 不会.c 文件编译为纯 C:

$ g++ -o test test.c 
$ ./test
I was compiled as C++!
$ 

关于linux - 为什么使用 g++ 而不是 gcc 来编译 *.cc 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6626363/

相关文章:

g++ -/usr/bin/ld : Dwarf Error

java - 运行应用程序时 eclipse 挂起(应用程序运行正常,eclipse 挂起)

linux - "mkdir || echo && exit"即使 mkdir 成功退出

c - 在Windows上允许C语言中的 "Special Characters"

c++ - 为什么通过对 gcc 和 clang 的优化将大 double 转换为 uint16_t 会给出不同的答案

c++ - TMP 缓慢的常见罪魁祸首是什么

c++ - 禁用关于在派生类的复制构造函数中显式初始化基构造函数的警告

linux - 如何为用户清除 linux 机器上的缓存内存?

linux - 如何将代码插入 vimoutliner 文件?

opencv - 在Beaglebone中使用openCV编译C++代码