为什么用g ++代替gcc编译* .cc文件?

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

为了证实这一点,我用gccreplace了原始makefile中的g ++。 而且我还是得到了正确的scheme。

任何人都可以解释呢? 这不是我第一次遇到这样的情况。

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

如果您以gcc身份调用编译器:

  • 它将根据文件扩展名( .c.cc / .cpp编译为C或C ++;
  • 它将链接为C,即它不会拉入C ++库,除非你专门添加额外的参数来这样做。

如果你以g++调用编译器:

  • 它会编译为C ++,而不管文件扩展名是.c还是.cc / .cpp ;
  • 它会链接为C ++,即自动拉入标准C ++库。

(请参阅GCC文档的相关位 )。


这里有一个简单的程序来检测它是否被编译为C或C ++。

(它利用了字符常量在C中是int的大小,或者是C ++中的字符的大小, 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++! $ 

编译和链接test.ccgcc不起作用:它将代码编译为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++! $ 

可能是.cc代码恰好是C,但是被打算链接到一个C ++库中。 内部是不同的。

g++自动链接C ++运行时库 – gcc不会。 可以忽略的是,什么时候它并不重要,那么它并不重要,但正如已经指出的那样,这可能是为了将来的使用。

我不知道他们为什么选择使用g ++而不是gcc,但是我相信这不重要,因为任何有效的C程序也是有效的C ++。