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

Windows下CMake无法找到ncurses、aubio预编译库问题求助

问题:Linux C++程序迁移Windows编译时ncurses和aubio头文件找不到

环境与操作情况

  • 正在将Linux编写的C++程序迁移到Windows编译,依赖ncurses,已在Cygwin终端安装对应库,验证结果:
cygcheck -c | grep curses
libncurses++w10          6.1-1.20190727     OK
libncurses-devel         6.1-1.20190727     OK
libncursesw10            6.1-1.20190727     OK
ncurses                  6.1-1.20190727     OK
  • 程序依赖aubio,已将预编译二进制包解压至C:\aubio,并将C:\aubio\bin加入系统PATH。
  • CMake配置命令cmake -G"Visual Studio 17" ..执行正常,但编译命令cmake --build . --target dissonance --config Debug报错:
fatal  error C1083: Datei (Include) kann nicht geöffnet werden: "aubio/aubio.h": No such file or directory
fatal  error C1083: Datei (Include) kann nicht geöffnet werden: "curses.h": No such file or directory
  • 通过Conan安装的库均能被CMake识别,但ncurses和aubio无法找到;曾尝试修改include和link路径为C:/cygwin64/lib/ C:/aubio/bin/,问题依旧。

简化后的CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
# set the project name and version
project(dissonance VERSION 1.0)
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()

# specify the C++ standard
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
if(APPLE)
  SET(CMAKE_CXX_FLAGS "-pthread -ldl -lm")
elseif(MSVC)
  SET(CMAKE_CXX_FLAGS "-pthread -ldl -lm -lncursesw -lcurses")
else()
  SET(CMAKE_CXX_FLAGS "-Wall -Werror -pthread -ldl -lm -lncursesw")
endif(APPLE)
add_compile_options(-fdiagnostics-color=always)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/bin)

# Add source files needed for tests and game
set(SRC_FILES
  [ removed for readility] 
)

# Add soruce files needed for game only
set(SRC_FILES_GAME 
  src/main.cc 
  ${SRC_FILES}
)

include_directories(/usr/local/lib/)
link_directories(/usr/local/lib/)

add_executable(dissonance ${SRC_FILES_GAME})

target_link_libraries(dissonance PUBLIC aubio curses ncurses ${CONAN_LIBS})

target_include_directories(dissonance PUBLIC "src")

问题根源与解决方向

核心问题

  1. 编译环境不兼容:用Visual Studio生成器(MSVC编译器)编译,但ncurses是Cygwin下的GCC版本库,MSVC无法识别Cygwin的头文件、库文件格式,两者ABI不兼容。
  2. 路径配置错误:
    • Cygwin的ncurses头文件在C:/cygwin64/usr/include,你当前include_directories指向的是库目录/usr/local/lib/,完全错误。
    • aubio的头文件在C:\aubio\include,你只把bin目录加入PATH,但CMake未配置该头文件路径;且bin目录是放可执行文件的,库文件一般在lib目录。
  3. CMakeLists.txt写法错误:
    • MSVC下不能用-lncursesw这类GCC风格的链接参数,MSVC用/link加.lib库名,而Cygwin的ncurses是.a/.so格式,无法被MSVC链接。
    • 直接在target_link_libraries里写aubio curses ncurses,CMake不知道这些库的位置,需要先指定路径或用find_package定位。

解决建议

  • 统一编译环境:
    要么全程用Cygwin的GCC编译:用cmake -G"Unix Makefiles"生成Makefile,然后在Cygwin终端执行make编译,这样可以直接使用已安装的Cygwin ncurses库。
    要么换用MSVC兼容的ncurses替代库,比如PDCurses,下载对应MSVC版本的库文件和头文件。
  • 修正路径配置(若坚持用MSVC):
    1. 确保aubio是MSVC版本的预编译包,包含include头文件目录和lib下的.lib库文件。
    2. 在CMakeLists.txt里添加正确的路径:
      # 配置aubio路径
      target_include_directories(dissonance PUBLIC "C:/aubio/include")
      target_link_directories(dissonance PUBLIC "C:/aubio/lib")
      # 配置PDCurses路径(替代Cygwin ncurses)
      target_include_directories(dissonance PUBLIC "C:/pdcurses/include")
      target_link_directories(dissonance PUBLIC "C:/pdcurses/lib")
      
    3. 替换MSVC分支的编译参数,改用MSVC支持的参数,比如:
      elseif(MSVC)
        # MSVC编译参数,示例:
        SET(CMAKE_CXX_FLAGS "/EHsc /MTd")
        # 链接参数用target_link_libraries指定.lib文件名
      endif(APPLE)
      
  • 规范CMake写法:
    避免直接用include_directories全局设置路径,改用target_include_directories针对目标设置;对于第三方库优先用find_package(如果库提供Config文件),无法自动查找的再手动指定路径。

内容的提问来源于stack exchange,提问作者georgbÜchner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 05:55:22