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

Linux 为什么要使用g++;代替gcc编译*.cc文件?,linux,gcc,g++,compilation,Linux,Gcc,G++,Compilation,我编译了一个使用g++而不是gcc的库。首先我认为源代码是用C++编写的,但是后来发现,*.cc文件中没有任何C++代码。p> 为了证实这一点,我将原始makefile中的g++替换为gcc。我仍然得到了正确的程序 有人能解释吗?这不是我第一次遇到这样的情况。 < P>我不知道为什么他们选择使用G+代替GCC,但是我相信这不重要,因为任何有效的C程序也是有效的C++。 < P>这可能是.cc代码恰好是C,但是它打算链接到C++库中。内件不同。 < p> g++< /COD>自动链接C++运行时

我编译了一个使用g++而不是gcc的库。首先我认为源代码是用C++编写的,但是后来发现,*.cc文件中没有任何C++代码。p> 为了证实这一点,我将原始makefile中的g++替换为gcc。我仍然得到了正确的程序


有人能解释吗?这不是我第一次遇到这样的情况。

< P>我不知道为什么他们选择使用G+代替GCC,但是我相信这不重要,因为任何有效的C程序也是有效的C++。

< P>这可能是.cc代码恰好是C,但是它打算链接到C++库中。内件不同。

< p> <代码> g++< /COD>自动链接C++运行时库-<代码> GCC 不。显然,当它不重要的时候——那么它就不重要了,但是,正如spraff已经指出的那样,它可以用于将来的使用。

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

如果您以
gcc
的形式调用编译器:

  • 将根据文件扩展名(C代码或C代码或C++代码,或<代码> .CC < /代码> /<代码> CPP < /代码>)编译为C或C++。李> 它将链接为C,即除非您添加了额外的参数,否则它将不在C++库中插入。
如果以
g++
的形式调用编译器:

  • 无论文件扩展名是“代码> > C++ >代码>还是代码> > CC < /代码> />代码> CPP < /代码>,< >李> 将链接为C++,即自动拉入标准C++库。
(见附件)


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

(利用C中字符常量大小为<代码> int <代码>的事实,或C++中的<代码> char < /> >定义为:代码>siZeOf(char)< /C> > 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
$
<编译>链接<代码>测试.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++,而不是C,因为它有一个<代码> .cc>代码>文件扩展名。 而
g++
不会将
.c
文件编译为普通c:

$ g++ -o test test.c 
$ ./test
I was compiled as C++!
$ 

不完全是。如果您的C代码有一个名为
class
int*x=malloc(sizeof(int));//这不是有效的C++,但是有效的c< /代码> @ BDONIN;这仍然是有效的C++,但是,它并不理想。C++允许调用一个称为Maloc的函数,它具有一个积分参数。C++编译器将在生成的代码中修改函数名(支持重载);C编译器不会。@ NEMO:即使你调用<代码> GCC < /C> >而不是<代码> G++<代码>,但是如果文件扩展名是C++源,那么C++编译器就被使用了。非常好的答案,我已经在我的机器上试用过你的测试代码。还有一个问题,正如您所说的,gcc在cc文件的链接阶段不会成功,您的测试代码证明了这一点。在我的makefile中,编译使用gcc,但链接阶段也使用gcc:CXXLD=$(CXX)CXXLINK=$(LIBTOOL)--tag=CXX$(AM\u libtoolsflags)$(libtoolsflags)\--mode=link$(CXXLD)$(AM\u CXXFLAGS)$(AM\u LDFLAGS)\$(LDFLAGS)-o$@其中CXX是gcc(我用gcc替换了g++)但是它仍然得到了正确的结果。@deepsky:如果代码是用正确的选项编译的,它可能不会对没有链接的库引入任何依赖关系。在我上面的例子中,投诉是关于
.eh_frame
部分中的某些内容,这与异常处理支持有关:在我的系统上,我发现
gcc-fno exceptions-o test.cc
工作正常。(运行<代码> ./Test< /Calp>仍然显示它是作为C++编译的,而不是C)可能的副本
$ gcc -c test.cc
$ g++ -o test test.o
$ ./test
I was compiled as C++!
$
$ g++ -o test test.c 
$ ./test
I was compiled as C++!
$