我编译了一个使用g ++而不是gcc的库。首先我认为源代码是用C ++编写的,但我后来发现* .cc文件中没有任何C ++代码。
为了确认这一点,我用gcc替换了原始makefile中的g ++。我仍然得到了正确的程序。
任何人都可以解释这个吗?这不是我第一次遇到这种情况。
答案 0 :(得分:18)
这取决于你在makefile中究竟改变了什么。 gcc
/ g++
实际上只是一个前端驱动程序,它根据您提供的选项调用实际的编译器和/或链接器。
如果您将编译器调用为gcc
:
.c
或.cc
/ .cpp
); 如果您将编译器调用为g++
:
.c
还是.cc
/ .cpp
,(见the relevant bit of the GCC documentation)。
这是一个简单的程序,可以检测它是否已编译为C或C ++。
(它利用了一个事实,即字符常量在C中的大小为int
,或在C ++中大小为char
。sizeof(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.c
和gcc
与test.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 ++。