我正在尝试使用 MSYS2 和 mingw-w64-x86_64-cmake
从源代码构建一个库 (
FMIL2.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 命令本身崩溃了。
根据我目前的研究,我尝试或排除的事情:
msys2_shell.cmd -mingw64 -use-full-path
启动 shell 没有任何区别。问题是由其中一个生成的 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 在处理嵌套引号时遇到了问题。