c++ - mingw32-make 使用 g++ 而不是 cc 或 gcc 来编译 .c 源文件

标签 c++ c gcc mingw

我最近安装了mingw-w64来学习c而不需要cygwin。问题是 mingw32-make 使用 g++ 来编译我的 .c 源代码,但我真的不知道为什么。此处说明了该行为:

这是来源:

#include <stdio.h>
int main(int argc, char *argv[])
{
    puts("Hello world.");
    return 0;
}

这是生成文件:

CC = gcc -O
CFLAGS=-Wall -g
clean:
    rm -f hello_world

使用 gnuwin32 版本的 make:

-> make hello_world
gcc -O -Wall -g    hello_world.c   -o hello_world

使用 mingw32-make:

-> mingw32-make hello_world
g++     hello_world.c   -o hello_world

谁能解释一下,或者知道为什么会这样?使用 Cygwin,也使用 Linux,make 工具按预期使用 c 编译器(通常是 cc)。为什么 mingw32-make 使用 g++ 而不是 gcc。 gcc安装在bin目录下。

mingw-w64 是截至 2 天前的最新 winbuild

最佳答案

mingw32-make(IMO 正确)将文件系统视为不区分大小写,因此 foo.c 和 FOO.C 指的是同一个文件。

您的 makefile 缺少针对 hello_world 目标的任何显式规则,因此必须使用内置的隐式规则;似乎 COMPILE.C 规则在 COMPILE.c 规则之前与 hello_world.c 匹配; COMPILE.C 是编译 C++ 的默认规则,因此使用适当的编译器。

正如您所注意到的,设置 CXX = gcc 是笨拙的,而且根本上是错误的;如果您的项目扩展到需要混合的 C 和 C++ 组件,它就会中断。一个更合适的解决方案是提供你自己的规则......要么是一个显式规则,要么是一个模式规则,以指示 mingw32-make 使用 $(CC) 编译 *.c(和 *.C)文件,以便内置的默认规则将不适用。然后,您可以保留 CXX = g++ 来编译任何 *.cpp 文件(建议与 MSVC 约定兼容),您的项目可能包含这些文件。

关于c++ - mingw32-make 使用 g++ 而不是 cc 或 gcc 来编译 .c 源文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28531272/

相关文章:

c++ - gcc -MDD with -isystem<include_path> 不会为 "system"路径添加依赖项

c++ - 不显示控制台的跨平台进入功能

c++ - OpenCV:如何检查 SparseMat 中是否存在元素

c++ - 我收到错误 "LINK : error LNK2001: unresolved external symbol _WinMainCRTStartup"

c - C 标准翻译限制规范中的 "At least one"

c - 简单递归帮助

c - 在docker下运行objdump显示不同的结果

c++ - 分数结构数组

c - 数组在调用 fscanf 时更改第一个值而不显式修改它

linux - GCC 在 Mac OS X 上编译程序,但在 Ubuntu 上不编译程序