2013-02-11 98 views
2

我有一个简单的,有代表性的C程序,保存在一个名为hello.c如何设置gcc使用文件扩展名(.c或.cpp)来确定正确的编译器/链接器?

#include <stdio.h> 
int main(void) 
{ 
    printf('Hello, world\n'); 
    return 0; 
} 

在我的Linux机器,我试图用gcc来编译程序:

gcc hello.c 

返回一个错误:

undefined reference to "___gxx_personality_v0" ... etc 

如之前在C++中的上下文beendiscussed有,这个问题在出现当gcc尝试将C库链接到一个C++程序时,这会产生错误。在one of the answers中,有人提到扩展确实是问题,并且gcc在编译C文件时需要扩展.c,并且在编译C++文件时需要其他扩展(例如.cpp)。

问题:如何设置gcc使用文件扩展名来确定使用哪个编译器,因为gcc似乎默认为我的系统上的C++?单独通过文件扩展名指定语言似乎不够。如果我使用-x标志指定语言,则gcc按预期运行。

gcc -x c hello.c 

回答

1

通常,你让make决定这一点。

GNU Make内置了隐式规则,可以自动选择合适的编译器。

尝试在Makefile中使用这些内容:

all: some_file.o some_other_file.o 

,然后将一个some_file.cppsome_other_file.c在同一目录中,和GNU make会自动选择正确的编译器。链接器,你可能仍然需要自己提供。当混合C和C++,它通常是最容易使用g ++链接,就像这样:

program.exe: some_file.o some_other_file.o 
    g++ -o [email protected] @^ 

这是一样的:

program.exe: some_file.o some_other_file.o 
    g++ -o program.exe some_file.o some_other_file.o 
+0

没有看见你的编辑之前,我贴我的最后意见(这处理make的隐式规则)。我不打算在这个项目中混用C和C++,但这仍然有助于了解。 – 2013-02-11 18:33:26

+2

@RicardoAltamirano,我想大约有一百万SO用户会回答这个问题,所以我冲上去放了一个占位符。 :-) – 2013-02-11 18:35:22

+1

哎呀,那很明显?显然C不是我的专长。 – 2013-02-11 18:36:19