我编译了一个使用 g++ 而不是 gcc 的库。一开始我以为源代码是用C++写的,后来发现*.cc文件里没有任何C++代码。
为了证实这一点,我用 gcc 替换了原始 makefile 中的 g++。而且我仍然得到了正确的程序。
谁能解释一下?我不是第一次遇到这种情况。
最佳答案
这取决于您在 makefile 中究竟更改了什么。 gcc
/g++
实际上只是一个前端驱动程序,它根据您提供的选项调用实际的编译器和/或链接器。
如果您将编译器调用为 gcc
:
- 它将根据文件扩展名(
.c
或.cc
/.cpp< 将 编译 为 C 或 C++/
); - 它将链接为 C,即它不会引入 C++ 库,除非您为此专门添加额外的参数。
如果您将编译器调用为 g++
:
- 无论文件扩展名是
.c
还是.cc
/.cpp<,它都会编译为 C++/
; - 它将链接为 C++,即自动引入标准 C++ 库。
(参见 the relevant bit of the GCC documentation)。
这是一个简单的程序,可以检测它是否已被编译为 C 或 C++。
(它利用了字符常量在 C 中的大小为 int
或在 C++ 中为 char
的事实。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++!
$
用 gcc
编译和链接 test.cc
不起作用:它将代码编译为 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++!
$
关于linux - 为什么使用 g++ 而不是 gcc 来编译 *.cc 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6626363/