在 MinGW-w64 中构建时出现“cmake.exe: Bad address”

问题描述 投票:0回答:1

我正在尝试使用 MSYS2 和 mingw-w64-x86_64-cmake 从源代码构建一个库 (

FMIL
2.0.3),调用
cmake.exe: Bad address
 时我被错误 
make

难住了

在 msys2 mingw64 shell 中执行 make 时,确切的错误是:

   $ make
   [  1%] Built target c99snprintf
   [  7%] Built target jmutils
   [  8%] Performing dependent_reconfigure step for 'expatex'
=> /bin/sh: line 1: /C/msys64/mingw64/bin/cmake.exe: Bad address  <==============================================
   make[2]: *** [CMakeFiles/expatex.dir/build.make:101: ExpatEx/stamp/expatex-dependent_reconfigure] Error 126
   make[1]: *** [CMakeFiles/Makefile2:257: CMakeFiles/expatex.dir/all] Error 2
   make: *** [Makefile:146: all] Error 2

上一步,执行cmake,无报错完成:

$ cmake -G "MSYS Makefiles" -DCMAKE_BUILD_TYPE=Release -DFMILIB_BUILD_STATIC_LIB=OFF -DFMILIB_BUILD_SHARED_LIB=ON ..

我正在使用全新安装 (

msys2-x86_64-20230318
),并尝试更新和重新安装 cmake、make 和 gcc 但没有成功:

$ pacman -S mingw-w64-x86_64-cmake    mingw-w64-x86_64-gcc    make

$ cmake --version
cmake version 3.26.3
CMake suite maintained and supported by Kitware (kitware.com/cmake).
$ which cmake
/mingw64/bin/cmake

$ make --version
GNU Make 4.4.1
Built for x86_64-pc-msys
$ which make
/usr/bin/make

$ gcc --version
gcc.exe (Rev10, Built by MSYS2 project) 12.2.0
$ which gcc
/mingw64/bin/gcc

$ pacman -Syuu
:: Synchronizing package databases...
 clangarm64 is up to date
 mingw32 is up to date
 mingw64 is up to date
 ucrt64 is up to date
 clang32 is up to date
 clang64 is up to date
 msys is up to date
:: Starting core system upgrade...
 there is nothing to do
:: Starting full system upgrade...
 there is nothing to do

问题显然可以通过使用

Ninja
而不是
make
来规避。

我能做些什么来解决或进一步分析这个错误?似乎是 cmake 命令本身崩溃了。

根据我目前的研究,我尝试或排除的事情:

  • 我在任何路径中都没有空格,
  • 我没有使用visual studio,
  • 我的gcc是mingw提供的当前版本,
  • msys2_shell.cmd -mingw64 -use-full-path
    启动 shell 没有任何区别。
  • 没有与问题相关的 Windows 事件日志或 MS Defender 日志
c++ cmake compiler-errors mingw-w64 msys
1个回答
0
投票

问题是由其中一个生成的 make 文件中的一行很长且可能格式错误引起的。

我希望这对其他有类似错误的人有用。显然这是 Windows 下 mingw、cmake 和 make 之间的一些奇怪的交互。

这里,其中一个 cmake 文件包含此部分:

  ExternalProject_Add_Step(
    expatex dependent_reconfigure
    DEPENDEES configure
    DEPENDERS build
>>  COMMAND ${CMAKE_COMMAND} -E echo "Running:  ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}"  ${EXPAT_SETTINGS} ${FMIXML_EXPAT_DIR}"
    COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" ${EXPAT_SETTINGS} "${FMIXML_EXPAT_DIR}"
    DEPENDS ${CMAKE_BINARY_DIR}/CMakeCache.txt
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/ExpatEx
  )

标记的行包含一些奇怪的嵌套引号,但由于这只是一个 echo 语句,所以这应该无关紧要。

生成的行看起来是这样的,有一些非常可疑的引号,但没有明显的语法错误,因为它就在

-E echo

之后
/C/msys64/mingw64/bin/cmake.exe -E echo "Running:  C:/msys64/mingw64/bin/cmake.exe -G " "MSYS Makefiles\"  -DBUILD_tools:BOOLEAN=OFF" -DBUILD_examples:BOOLEAN=OFF -DBUILD_tests:BOOLEAN=OFF ...

尽管如此,从生成的 make 文件中删除这一行解决了错误。

显然,当make进程在mingw shell中执行cmake进程时,这行导致cmake出错。我无法通过手动执行此行来重现错误,它仅在从

make
内执行时发生。也许 make 正在使用不同的 shell 来执行 cmake,而那个 shell 在处理嵌套引号时遇到了问题。

© www.soinside.com 2019 - 2024. All rights reserved.