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

时间:2015-02-15 21:17:07

标签: 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;
}

这是makefile:

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

2 个答案:

答案 0 :(得分:4)

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

你的makefile缺少hello_world目标的明确规则,因此必须使用内置的隐式规则;在COMPILE.c规则之前,似乎COMPLO.C规则与hello_world.c匹配; COMPILE.C是编译C ++的默认规则,因此使用了适当的编译器。

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

答案 1 :(得分:1)

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

解决方案是使用不启用case-insensitve文件系统选项(--enable-case-insensitive-file-system / HAVE_CASE_INSENSITIVE_FS)的GNU Make构建,或使用最新源(this修正或更新),问题得到解决。

进一步参考: