【问题标题】:How do I set gcc to use the file extension (.c or .cpp) to determine the correct compiler/linker?如何设置 gcc 以使用文件扩展名(.c 或 .cpp)来确定正确的编译器/链接器?
【发布时间】:2013-02-11 18:27:13
【问题描述】:

我有一个简单的、有代表性的 C 程序,存储在一个名为 hello.c 的文件中:

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

在我的 Linux 机器上,我尝试使用 gcc 编译程序:

gcc hello.c

返回错误:

undefined reference to "___gxx_personality_v0" ... etc

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

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

gcc -x c hello.c

【问题讨论】:

    标签: c gcc


    【解决方案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 $@ @^
    

    这与:

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

    【讨论】:

    • 在我发布我的最后一条评论(涉及 make 的隐式规则)之前没有看到您的编辑。我不打算在这个项目中混合使用 C 和 C++,但这仍然有助于了解。
    • @RicardoAltamirano,我认为大约有 100 万 SO 用户会回答这个问题,所以我急忙设置了一个占位符。 :-)
    • 哎呀,这么明显?显然 C 不是我的专长。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    • 2021-06-15
    • 2016-12-26
    相关资源
    最近更新 更多