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

时间:2011-07-08 15:02:28

标签: linux gcc g++ compilation

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

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

任何人都可以解释这个吗?这不是我第一次遇到这种情况。

4 个答案:

答案 0 :(得分:18)

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

如果您将编译器调用为gcc

  • 它将编译作为C或C ++基于文件扩展名(.c.cc / .cpp);
  • 它将链接作为C,即除非您专门添加其他参数,否则它不会引入C ++库。

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

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

(见the relevant bit of the GCC documentation)。


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

(它利用了一个事实,即字符常量在C中的大小为int,或在C ++中大小为charsizeof(char)的定义是1; {{1通常会更大 - 除非你使用的是一个带有> = 16位字节的模糊平台,你可能不会这样做。)

我已将其称为sizeof(int)并将其复制为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 $ test.cgcctest.cc进行编译和关联,可以按预期方式工作:

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不起作用:它将代码编译为C ++,因为文件以gcc结尾,但在链接阶段失败:

.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++! $ 已将代码编译为C ++而不是C,因为它具有gcc文件扩展名。

.cc g++文件编译为普通C:

.c

答案 1 :(得分:2)

可能是.cc代码发生是C,但是要链接到C ++库。内部是不同的。

答案 2 :(得分:1)

g++自动链接C ++运行时库 - gcc没有。如果无关紧要,那么无关紧要,但正如已经指出的那样,它可以用于将来使用。

答案 3 :(得分:-1)

我不知道他们为什么选择使用g ++而不是gcc,但我认为它无关紧要,因为任何有效的C程序也都是有效的C ++。