MinGW C编译器“无法编译简单的测试程序”

4

我希望将MinGW作为C编译器运行。MinGW已经通过Chocolatey安装。使用CMake从gitlab-runner调用时失败,错误信息如下:

$ cmake -G "MinGW Makefiles" -DCMAKE_C_COMPILER=x86_64-w64-mingw32-gcc -DLIB_MAN=OFF -DCMAKE_INSTALL_PREFIX=C:\opt\x64 -B. ..
-- The C compiler identification is unknown
-- Check for working C compiler: C:/ProgramData/chocolatey/bin/x86_64-w64-mingw32-gcc.exe
-- Check for working C compiler: C:/ProgramData/chocolatey/bin/x86_64-w64-mingw32-gcc.exe -- broken
CMake Error at C:/Program Files/CMake/share/cmake-3.16/Modules/CMakeTestCCompiler.cmake:60 (message):
  The C compiler

    "C:/ProgramData/chocolatey/bin/x86_64-w64-mingw32-gcc.exe"

  is not able to compile a simple test program.

  It fails with the following output:

    Change Dir: C:/gitlab-runner/builds/zjE1Mkfg/0/mlz/kww/build/CMakeFiles/CMakeTmp

    Run Build Command(s):C:/ProgramData/chocolatey/bin/mingw32-make.exe cmTC_ffa53/fast && C:/ProgramData/chocolatey/lib/mingw/tools/install/mingw64/bin/mingw32-make -f CMakeFiles\cmTC_ffa53.dir\build.make CMakeFiles/cmTC_ffa53.dir/build
    mingw32-make[1]: Entering directory 'C:/gitlab-runner/builds/zjE1Mkfg/0/mlz/kww/build/CMakeFiles/CMakeTmp'
    Building C object CMakeFiles/cmTC_ffa53.dir/testCCompiler.c.obj
    C:\ProgramData\chocolatey\bin\x86_64-w64-mingw32-gcc.exe    -o CMakeFiles\cmTC_ffa53.dir\testCCompiler.c.obj   -c C:\gitlab-runner\builds\zjE1Mkfg\0\mlz\kww\build\CMakeFiles\CMakeTmp\testCCompiler.c
    mingw32-make[1]: *** [CMakeFiles\cmTC_ffa53.dir\build.make:65: CMakeFiles/cmTC_ffa53.dir/testCCompiler.c.obj] Error 1
    mingw32-make[1]: Leaving directory 'C:/gitlab-runner/builds/zjE1Mkfg/0/mlz/kww/build/CMakeFiles/CMakeTmp'
    mingw32-make: *** [Makefile:120: cmTC_ffa53/fast] Error 2





  CMake will not be able to correctly generate this project.
Call Stack (most recent call first):
  CMakeLists.txt:6 (project)


-- Configuring incomplete, errors occurred!
See also "C:/gitlab-runner/builds/zjE1Mkfg/0/mlz/kww/build/CMakeFiles/CMakeOutput.log".
See also "C:/gitlab-runner/builds/zjE1Mkfg/0/mlz/kww/build/CMakeFiles/CMakeError.log".


ERROR: Job failed: exit status 1

从各种网络来源可以得知,如果系统中存在sh.exe,则MinGW注定会失败[1]。然而,sh.exe是几个应用程序中的一部分,其中包括Git和Visual Studio,我无法删除这些应用程序。有人建议添加-DCMAKE_SH="CMAKE_SH-NOTFOUND",但这似乎没有效果。
我看到了一个相关的问题,来自2015年[2],但与CLion有关。唯一被赞的答案包含多个损坏的链接-总的来说,该线程并不有用。
如何继续?有没有办法解决sh.exe的问题?
网络上的其他建议是使用-G "MSYS Makefiles"。然而,CMake文档[3]似乎排除了这种方法:“不兼容Windows命令提示符。要在Windows命令提示符下构建,请使用MinGW Makefiles生成器。”
[1] https://dev59.com/fVrUa4cB1Zd3GeqPghdY#7411982
[2] CLion: Error:The C compiler "C:/MinGW/bin/gcc.exe" is not able to compile a simple test program
[3] https://cmake.org/cmake/help/latest/generator/MSYS%20Makefiles.html#generator:MSYS%20Makefiles根据CMake 3.16.1

在短语“无法编译简单的测试程序”之后,应该有额外的输出,其中包含编译器或链接器引起的错误消息。 - Tsyvarev
是的,但是这个输出只告诉我们编译器无法编译...\CMakeTmp\testCCompiler.c。它进一步指向了CMakeOutput.logCMakeError.log,但也没有提供关于失败原因的任何信息。 - Joachim W
你所提供的参考链接 https://dev59.com/Ll0a5IYBdhLWcg3w07zt 包含了额外的信息。 - Tsyvarev
抱歉,什么信息? - Joachim W
从“它失败并输出以下内容:”到“CMake将无法正确生成此项目”的输出部分,我是指剩余内容。请不要描述错误消息(例如“从以下行我们了解到…”),而是按原样显示它们。请参阅该问题,其中讨论了此事。 - Tsyvarev
好的,我已经粘贴了完整的错误信息。 - Joachim W
2个回答

3

经过长时间的实验,我得出结论,问题来自于Chocolatey对MinGW的打包。在我

  • 卸载了Chocolatey中的MinGW包后,
  • 使用原始的MinGW安装程序重新安装MinGW,
  • 安装Ninja Chocolatey包,
  • C:\MinGW\bin插入到PATH的顶部后,问题消失了。
$ cmake -G "Ninja" -DLIB_MAN=OFF -DCMAKE_INSTALL_PREFIX=C:\opt\x64 -B. ..
-- The C compiler identification is GNU 8.2.0
-- Check for working C compiler: C:/MinGW/bin/gcc.exe
-- Check for working C compiler: C:/MinGW/bin/gcc.exe -- works

还要注意:

  • 不需要使用-DCMAKE_C_COMPILER=...
  • 我没有尝试过努力让-G "MinGW Makefile"工作;-G Ninja可以很好地工作。

如果在PATH中找不到编译器,则需要CMAKE_C_COMPILER - fdk1342
重新安装MinGW并重启电脑对我来说起作用了。 - gl3yn

1
< p > sh.exe 只会在您第一次运行 CMake 以尝试生成项目时出现问题。您可以重新运行 CMake,然后 CMake 将继续正常处理以生成项目(在版本 3.16 中进行了测试)。我看到了一个删除此检查的补丁,并应成为 CMake 的未来版本的一部分。

已经提到 gcc 安装不正确。每当有人提到 gcc 失败并显示 Error 1 时,似乎总是如此。应该注意的是,Error 1 不是来自 CMakeCMake 只是收集运行 mingw32-make 构建示例项目时的输出。

输出中的第一条消息 -- The C compiler identification is unknown 是明确表明编译器未工作的清晰消息。此步骤的所有输出都在 CMake 在构建文件夹中生成的日志和错误文件中。您将能够查看它如何调用编译器以及使用哪些选项以及编译器的输出。


那么我们认为问题的根源是MinGW Chocolatey包中gcc安装不正确,对吗?同时,我已经在Chocolatey MinGW Disqus页面上报告了这个问题。 - Joachim W
是的,看起来它无法编译一个简单的文件。 - fdk1342
重新安装mingw后,我不得不重启电脑。 - gl3yn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接