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

ming32-make is using g++ instead of cc or gcc to compile a .c source file

我最近安装了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 约定兼容),您的项目可能包含这些文件。

已确认这是 GNU Make 内部的一个问题,存在于启用了不区分大小写的文件系统选项的构建中。它也已在存储库中修复。

解决方案是使用未启用不区分大小写文件系统选项 (--enable-case-insensitive-file-system / HAVE_CASE_INSENSITIVE_FS) 的 GNU Make 版本,或者使用最新的源代码 (this 修订版或更新版本),问题已解决。

进一步参考: