CMake 3.9.1:CMake未找到库课程

CMake 3.9.1:CMake未找到库课程,c,cmake,C,Cmake,在您标记为副本之前,我已经阅读了8个与Stackoverflow类似的不同问题,在其他地方更是如此。如果这些答案中的任何一个解决了我的问题,我就不会发布这篇文章 我在SDL2库中使用了这个精确的模板,没有任何问题,我所做的唯一更改是将“SDL2”更改为“Curses”,以及集合(Curses\u NEED\u NCURSES TRUE)行。(对于任何想知道的人来说,如果没有这一行,这仍然是失败的) 是的,我已经安装了它,我可以轻松地用gcc main.c-lncurses编译它,而不会出现问题

在您标记为副本之前,我已经阅读了8个与Stackoverflow类似的不同问题,在其他地方更是如此。如果这些答案中的任何一个解决了我的问题,我就不会发布这篇文章

我在SDL2库中使用了这个精确的模板,没有任何问题,我所做的唯一更改是将“SDL2”更改为“Curses”,以及
集合(Curses\u NEED\u NCURSES TRUE)
行。(对于任何想知道的人来说,如果没有这一行,这仍然是失败的)

是的,我已经安装了它,我可以轻松地用gcc main.c-lncurses编译它,而不会出现问题

cmake_minimum_required (VERSION 2.6)
project (ncurses-practice)

# Version info
set(CMake_ncurses-practice_VERSION_MAJOR 1)
set(CMake_ncurses-practice_VERSION_MINOR 0)

# Common Variables
set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/bin)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR})
set(SRC ${CMAKE_SOURCE_DIR}/src)
set(HDRS ${CMAKE_SOURCE_DIR}/headers)
set(CMAKE_C_FLAGS " -Wall")

# Set Ncurses
set(CURSES_NEED_NCURSES TRUE)
find_package(Curses)


# Debug
set(CMAKE_BUILD_TYPE Debug)

# Source Files
set(SRC_FILES
  ${SRC}/main.c
)

# Included directories
include_directories("src" "headers" ${CURSES_INCLUDE_DIRS})

# Generate Executable
add_executable(a.out ${SRC_FILES})

# Add libraries here after the project name
target_link_libraries(ncurses-practice ${CURSES_LIBARIES})

您的代码中有一个bug:

add_executable(a.out ${SRC_FILES})

target_link_libraries(ncurses-practice ${CURSES_LIBARIES})
target\u link\u库
需要指定目标名称,而不是项目名称。因此,第二行应该改为
target\u link\u libraries(a.out${CURSES\u LIBARIES})
(顺便说一句,这是一个可怕的可执行文件名称)

我在SDL2库中使用了这个模板,没有任何问题, 我所做的唯一更改是将“SDL2”更改为“诅咒”

不幸的是,find脚本不是这样工作的。虽然CMake希望行为良好的find脚本遵循某些约定,但这些约定的指导原则比严格的规则更为宽松。因此,您通常不能依赖与一个find脚本一起工作的代码来与另一个脚本一起工作

相反,您必须始终检查要使用的脚本的文档(通常甚至是源代码),并仔细地为其定制周围的代码

在您的情况下,相关文档是源文件,而源文件是源文件

从这一点你可以看出,这种逻辑并不十分明智。确保本地安装的curses的路径对应于。如果你认为脚本的发现机制可以改进,考虑打开一个改进版本的拉请求。 此外,确保在CMake脚本中使用查找脚本中使用的任何值之前,检查它们是否已实际设置

也请考虑不要在CMAScript脚本中设置<代码> CMACHIN BIARYARDIR <代码>。该变量应该由构建项目的用户设置,而不是由项目本身设置。对于

CMAKE_BUILD_TYPE

find_package(Curses)
也同样如此,它期望
FindCurses.CMAKE
文件出现在您的CMAKE_模块路径中

FindCurses.cmake应该找到curses库并设置所需的变量。您可以在此FindCurses.cmake中使用其他函数,如find_path、find_library来查找curses库。另一种方法是编写一个.pc文件并使用pkg_check_模块查找这个Curses库

除此之外,这两条线都是马车

添加可执行文件(a.out${SRC\u FILES})

目标链接库(ncurses practice${CURSES\u LIBARIES})

这里add_executable正在创建一个名为a.out的目标,您正在链接一个不存在的目标(ncurses实践)的CURSES_库

因此,将add_可执行文件更改为

add_executable(ncurses-practice ${SRC_FILES})

任何错误消息?可能与错误无关,但:
set(CMAKE\u BINARY\u DIR…
-从不设置
CMAKE\u BINARY\u DIR
变量。许多外部和内部脚本都假定它指向顶级二进制目录<代码>设置(CMake\u ncurses-practice\u VERSION\u MAJOR 1)-“CMake”应为大写。否则变量对CMake没有意义。您的CMake模块路径中是否有FindCourses、CMake?