为什么使用g ++而不是gcc编译* .cc文件?
我编译了一个使用g ++而不是gcc的库。 首先,我认为源代码是用C ++编写的,但后来我发现在* .cc文件中没有任何C ++代码。
为了证实这一点,我用gcc替换了原始makefile中的g ++。 我仍然得到了正确的方案。
任何人都可以解释这个 这不是我第一次遇到这种情况。
这取决于你在makefile中改变了什么。 gcc / g++实际上只是一个前端驱动程序,它根据您提供的选项调用实际的编译器和/或链接器。
如果您以gcc身份调用编译器:
.c或.cc / .cpp )编译为C或C ++; 如果你以g++调用编译器:
.c还是.cc / .cpp ,它都将编译为C ++; (请参阅GCC文档的相关部分)。
这是一个简单的程序,它可以检测它是否被编译为C或C ++。
(它利用一个字符常数具有一个大小的事实int在C,或char在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.cc与gcc无效:它将代码编译为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不会。 可以忽略的是,什么时候它并不重要 - 那么它并不重要,但正如已经指出的那样,它可以用于将来的使用。
上一篇: why use g++ instead of gcc to compile *.cc files?
下一篇: linker problem with libstdc++.so.6 in connection with cuda
