You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MSYS2环境下CMake无法找到Curses库及编译报错求助

MSYS2环境下CMake链接ncurses库的问题与解决方案

问题场景1:MSYS2自带CMake无法找到Curses库

已在MSYS2中安装ncurses库,使用以下CMake代码:

find_package(Curses REQUIRED)
include_directories(${CURSES_INCLUDE_DIR})
MESSAGE(STATUS "CURSES_INCLUDE_DIR is ${CURSES_INCLUDE_DIR}")

运行cmake .时报错,提示无法找到Curses库:

CMake Error at /usr/share/cmake-3.23.2/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
  Could NOT find Curses (missing: CURSES_LIBRARY CURSES_INCLUDE_PATH)
Call Stack (most recent call first):
  /usr/share/cmake-3.23.2/Modules/FindPackageHandleStandardArgs.cmake:594 (_FPHSA_FAILURE_MESSAGE)
  /usr/share/cmake-3.23.2/Modules/FindCurses.cmake:268 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  CMakeLists.txt:34 (find_package)

问题场景2:使用mingw64的CMake生成构建文件后编译失败

改用/mingw64/bin/cmake生成build.ninja或MinGW Makefile,但执行mingw32-make或ninja时,出现头文件报错Only Win32 target is supported!,同时main.cpp找不到curses.h:

mingw32-make[1]: Entering directory 'C:/Users/Caikera/Documents/workspace/sw/cpp/tetris/Build'
-- C:/Users/Caikera/Documents/workspace/sw/cpp/tetris
-- CURSES_INCLUDE_DIR is C:/packages/msys2/mingw64/include
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/Caikera/Documents/workspace/sw/cpp/tetris/Build
mingw32-make[2]: Entering directory 'C:/Users/Caikera/Documents/workspace/sw/cpp/tetris/Build'
mingw32-make[3]: Entering directory 'C:/Users/Caikera/Documents/workspace/sw/cpp/tetris/Build'
mingw32-make[3]: Leaving directory 'C:/Users/Caikera/Documents/workspace/sw/cpp/tetris/Build'
mingw32-make[3]: Entering directory 'C:/Users/Caikera/Documents/workspace/sw/cpp/tetris/Build'
[ 50%] Building CXX object CMakeFiles/tetris.dir/main.cpp.obj
In file included from /usr/lib/gcc/x86_64-pc-msys/11.3.0/include/c++/ctime:42,
                 from /usr/lib/gcc/x86_64-pc-msys/11.3.0/include/c++/chrono:42,
                 from C:\Users\Caikera\Documents\workspace\sw\cpp\tetris\main.cpp:6:
C:/packages/msys2/mingw64/include/time.h:12:2: 错误:#error Only Win32 target is supported!
   12 | #error Only Win32 target is supported!
      |  ^~~~~
In file included from C:/packages/msys2/mingw64/include/time.h:25,
                 from /usr/lib/gcc/x86_64-pc-msys/11.3.0/include/c++/ctime:42,
                 from /usr/lib/gcc/x86_64-pc-msys/11.3.0/include/c++/chrono:42,
                 from C:\Users\Caikera\Documents\workspace\sw\cpp\tetris\main.cpp:6:
C:/packages/msys2/mingw64/include/sys/timeb.h:12:2: 错误:#error Only Win32 target is supported!
   12 | #error Only Win32 target is supported!
      |  ^~~~~
In file included from C:/packages/msys2/mingw64/include/pthread.h:64,
                 from /usr/lib/gcc/x86_64-pc-msys/11.3.0/include/c++/x86_64-pc-msys/bits/gthr-default.h:35,
                 from /usr/lib/gcc/x86_64-pc-msys/11.3.0/include/c++/x86_64-pc-msys/bits/gthr.h:148,
                 from /usr/lib/gcc/x86_64-pc-msys/11.3.0/include/c++/ext/atomicity.h:35,
                 from /usr/lib/gcc/x86_64-pc-msys/11.3.0/include/c++/bits/ios_base.h:39,
                 from /usr/lib/gcc/x86_64-pc-msys/11.3.0/include/c++/ios:42,
                 from /usr/lib/gcc/x86_64-pc-msys/11.3.0/include/c++/ostream:38,
                 from /usr/lib/gcc/x86_64-pc-msys/11.3.0/include/c++/iostream:39,
                 from C:\Users\Caikera\Documents\workspace\sw\cpp\tetris\main.cpp:8:
C:/packages/msys2/mingw64/include/sys/types.h:10:2: 错误:#error Only Win32 target is supported!
   10 | #error Only Win32 target is supported!
      |  ^~~~~
In file included from /usr/lib/gcc/x86_64-pc-msys/11.3.0/include/c++/cwctype:50,
                 from /usr/lib/gcc/x86_64-pc-msys/11.3.0/include/c++/bits/locale_facets.h:39,
                 from /usr/lib/gcc/x86_64-pc-msys/11.3.0/include/c++/bits/basic_ios.h:37,
                 from /usr/lib/gcc/x86_64-pc-msys/11.3.0/include/c++/ios:44,
                 from /usr/lib/gcc/x86_64-pc-msys/11.3.0/include/c++/ostream:38,
                 from /usr/lib/gcc/x86_64-pc-msys/11.3.0/include/c++/iostream:39,
                 from C:\Users\Caikera\Documents\workspace\sw\cpp\tetris\main.cpp:8:
C:/packages/msys2/mingw64/include/wctype.h:10:2: 错误:#error Only Win32 target is supported!
   10 | #error Only Win32 target is supported!
      |  ^~~~~
C:\Users\Caikera\Documents\workspace\sw\cpp\tetris\main.cpp:15:10: 致命错误:curses.h:No such file or directory
   15 | #include "curses.h"
      |          ^~~~~~~~~~

解决方案

1. 安装对应环境的ncurses包

MSYS2包含三个独立环境,需匹配安装ncurses:

  • 若使用MSYS环境:执行pacman -S ncurses安装对应包
  • 若使用mingw64环境:执行pacman -S mingw-w64-x86_64-ncurses安装对应包
  • 若使用mingw32环境:执行pacman -S mingw-w64-i686-ncurses安装对应包

2. 严格使用对应环境的工具链

不要混合MSYS和MinGW工具链:

  • 打开对应环境的终端(如Mingw64终端),所有操作(CMake、编译、链接)都使用该终端内的工具,避免在MSYS终端调用MinGW的CMake或编译器。
  • 错误根源是MSYS编译器针对类POSIX的MSYS环境,而MinGW头文件仅支持Win32目标,混合使用会导致平台不匹配。

3. 修正CMakeLists.txt配置

替换原有代码为以下规范写法,确保正确链接库和头文件:

cmake_minimum_required(VERSION 3.10)
project(tetris)

# 查找ncurses库
find_package(Curses REQUIRED)

# 添加可执行文件
add_executable(tetris main.cpp)

# 为目标添加头文件路径
target_include_directories(tetris PRIVATE ${CURSES_INCLUDE_DIR})

# 为目标链接ncurses库
target_link_libraries(tetris PRIVATE ${CURSES_LIBRARIES})

# 打印调试信息
MESSAGE(STATUS "CURSES_INCLUDE_DIR: ${CURSES_INCLUDE_DIR}")
MESSAGE(STATUS "CURSES_LIBRARIES: ${CURSES_LIBRARIES}")

4. 正确执行构建流程

以Mingw64环境为例:

  1. 打开Mingw64终端,进入项目根目录
  2. 创建并进入构建目录:
    mkdir build && cd build
    
  3. 生成构建文件并编译:
    cmake .. -G "MinGW Makefiles"
    mingw32-make
    

内容的提问来源于stack exchange,提问作者Kera

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:20:36