为什么用g ++而不是gcc编译*.cc文件?

dee*_*sky 6 linux gcc compilation g++

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

为了证实这一点,我用gcc替换了原始makefile中的g ++.我仍然得到了正确的程序.

有谁能解释一下?这不是我第一次遇到这种情况.

Mat*_*ery 18

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

如果您将编译器调用为gcc:

  • 它将根据文件扩展名(,或/ )编译为C或C++ ;.c.cc.cpp
  • 它将链接为C,即除非您专门添加其他参数,否则它不会引入C++库.

如果您将编译器调用为g++:

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

(参见GCC文档的相关位).


这是一个简单的程序,可以检测它是否已编译为C或C++.

(它利用了一个事实,即字符常量的大小为intC或charC++. 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
$
Run Code Online (Sandbox Code Playgroud)

编译和链接test.cgcc,并test.ccg++,按预期工作:

$ gcc -o test test.c
$ ./test
I was compiled as C!
$ g++ -o test test.cc
$ ./test
I was compiled as C++!
$ 
Run Code Online (Sandbox Code Playgroud)

编译和链接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
$ 
Run Code Online (Sandbox Code Playgroud)

我们可以通过单独编译gcc和链接来证明g++(以拉入正确的库):

$ gcc -c test.cc
$ g++ -o test test.o
$ ./test
I was compiled as C++!
$
Run Code Online (Sandbox Code Playgroud)

... gcc已将代码编译为C++而不是C,因为它具有.cc文件扩展名.

g++没有编译.c文件为纯C:

$ g++ -o test test.c 
$ ./test
I was compiled as C++!
$ 
Run Code Online (Sandbox Code Playgroud)