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")
问题根源与解决方向
核心问题
- 编译环境不兼容:用Visual Studio生成器(MSVC编译器)编译,但ncurses是Cygwin下的GCC版本库,MSVC无法识别Cygwin的头文件、库文件格式,两者ABI不兼容。
- 路径配置错误:
- Cygwin的ncurses头文件在
C:/cygwin64/usr/include,你当前include_directories指向的是库目录/usr/local/lib/,完全错误。 - aubio的头文件在
C:\aubio\include,你只把bin目录加入PATH,但CMake未配置该头文件路径;且bin目录是放可执行文件的,库文件一般在lib目录。
- Cygwin的ncurses头文件在
- CMakeLists.txt写法错误:
- MSVC下不能用
-lncursesw这类GCC风格的链接参数,MSVC用/link加.lib库名,而Cygwin的ncurses是.a/.so格式,无法被MSVC链接。 - 直接在
target_link_libraries里写aubio curses ncurses,CMake不知道这些库的位置,需要先指定路径或用find_package定位。
- MSVC下不能用
解决建议
- 统一编译环境:
要么全程用Cygwin的GCC编译:用cmake -G"Unix Makefiles"生成Makefile,然后在Cygwin终端执行make编译,这样可以直接使用已安装的Cygwin ncurses库。
要么换用MSVC兼容的ncurses替代库,比如PDCurses,下载对应MSVC版本的库文件和头文件。 - 修正路径配置(若坚持用MSVC):
- 确保aubio是MSVC版本的预编译包,包含
include头文件目录和lib下的.lib库文件。 - 在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") - 替换MSVC分支的编译参数,改用MSVC支持的参数,比如:
elseif(MSVC) # MSVC编译参数,示例: SET(CMAKE_CXX_FLAGS "/EHsc /MTd") # 链接参数用target_link_libraries指定.lib文件名 endif(APPLE)
- 确保aubio是MSVC版本的预编译包,包含
- 规范CMake写法:
避免直接用include_directories全局设置路径,改用target_include_directories针对目标设置;对于第三方库优先用find_package(如果库提供Config文件),无法自动查找的再手动指定路径。
内容的提问来源于stack exchange,提问作者georgbÜchner
相关产品推荐
相关产品推荐

