dee*_*sky 6 linux gcc compilation g++
我编译了一个使用g ++而不是gcc的库.首先我认为源代码是用C++编写的,但我后来发现*.cc文件中没有任何C++代码.
为了证实这一点,我用gcc替换了原始makefile中的g ++.我仍然得到了正确的程序.
有谁能解释一下?这不是我第一次遇到这种情况.
Mat*_*ery 18
这取决于你在makefile中究竟改变了什么. gcc/ g++实际上只是一个前端驱动程序,它根据您提供的选项调用实际的编译器和/或链接器.
如果您将编译器调用为gcc:
.c.cc.cpp如果您将编译器调用为g++:
.c或.cc/ .cpp;(参见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.c用gcc,并test.cc用g++,按预期工作:
$ 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.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
$
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)