为什么使用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