MSYS2 上的 CMake 冻结

Posted

技术标签:

【中文标题】MSYS2 上的 CMake 冻结【英文标题】:CMake on MSYS2 freezes up 【发布时间】:2018-08-31 21:08:11 【问题描述】:

我在 Windows 8 上运行 MSYS2,但遇到 CMake 冻结/锁定问题。

这是一个最小的例子:

main.cpp:

#include <iostream>
int main()
   
   std::cout << "Hello World!" << std::endl;
   return 0;

CMakeLists.txt:

cmake_minimum_required(VERSION 3.0.0)
project (helloworld)
add_executable(helloworld main.cpp)

如果我打开MSYS2控制台,进入上述两个文件所在的目录,执行命令

cmake .

没有进一步的输出,控制台锁定。创建了一个空的 CMakeFiles 文件夹,但没有其他任何事情发生。我已经尝试过使用 CMake 3.10.2 和 3.2.3 并且两个版本都发生了同样的情况。


如果有兴趣,下面是一些straceoutput: 如果我运行命令

strace cmake .

我在不同的时间得到不同的输出。有时最后一行是这样的

19   4436   [main] cmake 2320 child_copy: done

有时候是这样的

44   239509 [main] cmake 9820 open_shared: name cygpid.10668 n 10668, shared 0xBB0000 (wanted 0x0), h 0x344, *m 6

有时输出的结尾类似于

   20 2735480 [main] cmake 14200 kill_pgrp: killing pid 5900, pgrp 5900, p->ctty /dev/pty0, ctty /dev/pty5
   24 2735504 [main] cmake 14200 sig_send: 1 = SetNamedPipeHandleState (0x358, PIPE_NOWAIT, NULL, NULL)
   16 2735520 [main] cmake 14200 sig_send: sendsig 0x358, pid 5900, signal 17, its_me 0
   19 2735539 [main] cmake 14200 sig_send: Not waiting for sigcomplete.  its_me 0 signal 17
   24 2735563 [main] cmake 14200 sig_send: returning 0x0 from sending signal 17
   23 2735586 [main] cmake 14200 _pinfo::kill: 0 = _pinfo::kill (17), pid 5900, process_state 0x4C5
   20 2735606 [main] cmake 14200 kill_pgrp: killing pid 15152, pgrp 15152, p->ctty /dev/pty5, ctty /dev/pty5
 3486 2739092 [main] cmake 14200 sig_send: 1 = SetNamedPipeHandleState (0x3A0, PIPE_NOWAIT, NULL, NULL)
   44 2739136 [main] cmake 14200 sig_send: sendsig 0x3A0, pid 15152, signal 17, its_me 0
   33 2739169 [main] cmake 14200 sig_send: Not waiting for sigcomplete.  its_me 0 signal 17
   27 2739196 [main] cmake 14200 sig_send: returning 0x0 from sending signal 17
   25 2739221 [main] cmake 14200 _pinfo::kill: 0 = _pinfo::kill (17), pid 15152, process_state 0x61

这些问题的原因可能是什么?


编辑:

的输出
cmake . --trace

在冻结之前如下:

Running with trace output on.
d/Dropbox/Programming/Cplusplus/workspace/Testprograms/test_cmake/CMakeLists.txt(1): cmakeminimum_required(VERSION 3.0.0 )
d/Dropbox/Programming/Cplusplus/workspace/Testprograms/test_cmake/CMakeLists.txt(2): project(helloworld ) 
usr/share/cmake-3.10.2/Modules/CMakeDetermineSystem.cmake(36): 
if(CMAKE_HOST_UNIX )
usr/share/cmake-3.10.2/Modules/CMakeDetermineSystem.cmake(37): find_program(CMAKE_UNAME uname /bin /usr/bin /usr/local/bin ) 
usr/share/cmake-3.10.2/Modules/CMakeDetermineSystem.cmake(38): if(CMAKE_UNAME)
usr/share/cmake-3.10.2/Modules/CMakeDetermineSystem.cmake(39): if(CMAKE_HOST_SYSTEM_NAME STREQUAL AIX )
usr/share/cmake-3.10.2/Modules/CMakeDetermineSystem.cmake(45): else() 
usr/share/cmake-3.10.2/Modules/CMakeDetermineSystem.cmake(46): 
exec_program($CMAKE_UNAME1 ARGS -r OUTPUT_VARIABLE CMAKE_HOST_SYSTEM_VERSION )

【问题讨论】:

cmake --trace 代替 strace cmake 怎么样?它还挂着吗? 另外,您是否尝试过卸载 MSYS2 软件包并安装 Windows 原生 CMake?我意识到键入 $(cygpath -w /cygdrive/c/path/to/directory/) 的 MSYS2 等效项以将 Windows 版本的 CMake 提供给目录 C:\path\to\directory 是很痛苦的,但这仅用于测试; MSYS2 adds some patches to CMake 在构建之前可能是问题所在。 最后,确保您的环境已更新:pacman -Syuu。如果是,您可以搜索现有问题或在 MSYS2 packages issue tracker on GitHub 上为 CMake 打开一个新问题。虽然可能不相关,因为 MSYS2 和 MINGW 完全不同(如 MINGW 和 Cygwin),但我确实在 MINGW 包问题跟踪器中找到了this issue。也许那里描述的事情正在发生类似的事情并且杀死 cc1.exe 有效?它可能包含在您自己的错误报告中。 如果你最近升级了,你可能会考虑降级最近升级的东西。 我将cmake --trace 的输出添加为编辑(是的,它仍然挂起)。如果我明确调用 Windows 的 CMake 安装,/f/ProgramFiles/CMake/bin/cmake.exe .. -G "Unix Makefiles" 它可以工作!我会提交错误报告。感谢您的帮助! 【参考方案1】:

CMake 不喜欢树形构建。创建一个单独的构建文件夹。

mkdir build
cd build
cmake ..

CMake 不会构建您的程序,它只会创建构建文件。您的下一步将是。

mingw32-make

除非您有其他问题,否则您应该能够运行您的程序。

迈克

【讨论】:

那也行不通。这次我收到了错误消息4 [main] cmake 16324 chi1d_info_fork::abort: F:\msy532\usr\bin\msys—idn2—O.d11: Loaded to different address: parent(0x370000) != chi1d(0x800000) 1- 这是唯一的错误吗? 2-您运行的是 MinGW 还是 Cygwin? 3-您在什么阶段收到此错误? Re 2-:它是 MSYS2,Cygwin 的一个分支,使用 Arch Linux 的 pacmanmakepkg 打包系统,可能还有很多其他自定义。

以上是关于MSYS2 上的 CMake 冻结的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MSYS2 中通过 CMake 构建 c++ Qt5 应用程序

msys2提示:-bash: cmake: command not found

基于TDengine-ver-1.6.4.4在windows 10下cmake+msys2编译(windows cgo 使用)

cmake msys2 mingw无法编译简单的测试程序

CMake 使用其他静态库构建静态库

Linux CentOS 7上的CMake,如何强制系统使用cmake3?