在Linux与Windows平台启用curses库的技术问题咨询
兄弟,我太懂你这种跨平台CMake配置的痛苦了——Linux上ncurses的CMake支持顺得一批,到Windows直接卡壳对吧?我之前做类似的curses项目踩过不少坑,给你两个靠谱的解决方案,分场景说:
首选方案:用MSYS2/MinGW环境编译(最贴近Linux体验)
Windows原生没有ncurses,但是MSYS2的MinGW仓库里有和Linux几乎一致的ncurses移植版,配置起来最省心。
步骤1:安装依赖
打开MSYS2的MinGW终端(比如MinGW64 Terminal),先装ncurses:
pacman -S mingw-w64-x86_64-ncurses
如果是32位系统就把x86_64换成i686。
步骤2:修改你的CMakeLists.txt
把你原来的配置改成下面这样(补全了C++标准,加了Windows适配逻辑):
cmake_minimum_required(VERSION 3.9) project(fighting_pit) # 区分Windows和Linux的ncurses查找逻辑 if(WIN32) # MSYS2下用pkg-config找ncurses更靠谱 find_package(PkgConfig REQUIRED) pkg_check_modules(CURSES REQUIRED ncurses) else() find_package(Curses REQUIRED) endif() include_directories(${CURSES_INCLUDE_DIRS}) # 这里替换成你需要的C++标准,比如17、20 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 替换成你的实际源文件列表 add_executable(fighting_pit main.cpp your_other_files.cpp) # 链接ncurses库 target_link_libraries(fighting_pit ${CURSES_LIBRARIES})
步骤3:正常编译
在MinGW终端里按Linux的流程来就行:
mkdir build && cd build cmake .. -G "MinGW Makefiles" make
跑起来和Linux上几乎没区别,代码兼容性也最好。
备选方案:用Visual Studio原生编译
如果一定要用VS的MSVC编译器,那得用PDCurses(Windows平台的curses替代实现),配置稍微麻烦点:
步骤1:编译PDCurses
- 下载PDCurses的源代码(直接去官网下zip包就行)
- 打开VS的开发者命令提示符,进入PDCurses的
win32目录,执行:
nmake -f makefile.vc
编译完会得到pdcurses.lib和pdcurses.dll之类的文件。
步骤2:修改CMakeLists.txt
cmake_minimum_required(VERSION 3.9) project(fighting_pit) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) if(WIN32) # 替换成你编译好的PDCurses路径 set(PDCURSES_ROOT "C:/path/to/your/pdcurses") include_directories(${PDCURSES_ROOT}/include) link_directories(${PDCURSES_ROOT}/lib) set(CURSES_LIBRARIES pdcurses.lib) else() find_package(Curses REQUIRED) include_directories(${CURSES_INCLUDE_DIR}) endif() add_executable(fighting_pit main.cpp your_other_files.cpp) target_link_libraries(fighting_pit ${CURSES_LIBRARIES}) # VS下要确保控制台子系统,不然运行会黑屏 if(MSVC) set_target_properties(fighting_pit PROPERTIES LINK_FLAGS "/SUBSYSTEM:CONSOLE") endif()
额外注意:代码兼容
Windows的curses库和Linux的ncurses有少量API差异,比如一些宏定义或者函数行为,你可能需要在代码里加条件编译:
#ifdef _WIN32 #include <curses.h> // PDCurses的头文件 #else #include <ncurses.h> #endif // 举个例子,有些终端初始化逻辑可能要调整 #ifdef _WIN32 initscr(); // Windows下可能需要额外调用cbreak()之类的 #else initscr(); cbreak(); noecho(); #endif
总的来说,优先选MSYS2/MinGW的方案,省掉很多代码兼容的麻烦,配置也更贴近你在Arch Linux上的习惯。
内容的提问来源于stack exchange,提问作者Jakub Peschel
相关产品推荐
相关产品推荐

