【问题标题】:ming32-make is using g++ instead of cc or gcc to compile a .c source filemingw32-make 使用 g++ 而不是 cc 或 gcc 来编译 .c 源文件
【发布时间】:2015-02-15 21:17:07
【问题描述】:

我最近安装了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

【问题讨论】:

  • 您可以尝试使用-x c 强制C 编译。将其添加到您的CFLAGS。您还可以将CXX = gcc -O 添加到您的makefile 中。如果它也没有得到尊重,那么它可能有助于进一步隔离问题。
  • 感谢您的意见。使用 "CFLAGS=-Wall -g -x c" 不会导致所需的行为,但使用 CXX = gcc -O 确实会导致使用 gcc 作为编译器。我想这只是告诉 make 用 gcc 编译 c++ 文件?我想有点 hack。

标签: c++ c gcc mingw


【解决方案1】:

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 约定兼容)。

【讨论】:

  • 也就是说,MinGW 开发人员并不真正喜欢 mingw32-make;我们提倡使用 MinGW.org 的补充 MSYS 平台工具,以及它们所包含的品牌,作为更好的选择。
【解决方案2】:

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

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

更多参考资料:

【讨论】:

    猜你喜欢
    • 2011-10-01
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    相关资源
    最近更新 更多