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环境为例:
- 打开Mingw64终端,进入项目根目录
- 创建并进入构建目录:
mkdir build && cd build - 生成构建文件并编译:
cmake .. -G "MinGW Makefiles" mingw32-make
内容的提问来源于stack exchange,提问作者Kera
相关产品推荐
相关产品推荐

