CMake 3.9.1:Cmake没有找到库ncurses

时间:2017-09-19 02:29:37

标签: c cmake

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

我在SDL2库中使用了这个确切的模板没有问题,我所做的唯一改变就是改变了#SD; SDL2"到"诅咒"以及set(CURSES_NEED_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})

2 个答案:

答案 0 :(得分:0)

您的代码中存在错误:

add_executable(a.out ${SRC_FILES})

target_link_libraries(ncurses-practice ${CURSES_LIBARIES})

target_link_libraries需要被赋予目标的名称,而不是项目的名称。所以第二行应该是target_link_libraries(a.out ${CURSES_LIBARIES})而不是(这是可执行文件的可怕名称,顺便说一句)。

  

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

不幸的是,这不是查找脚本的方式。虽然有一些约定,CMake希望遵循一个表现良好的查找脚本,但这些约定比严格的规则更宽松。因此,您通常不能依赖使用一个查找脚本的代码来与另一个一起使用。

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

在您的情况下,相关文档为CMake doc for the FindCurses module,而来源为can be found on Kitware's gitlab

从这里你可以看出逻辑不是很聪明。确保本地安装的curses路径与what the script expects相对应。如果您认为可以改进脚本的查找机制,请考虑使用改进版本打开pull请求。

此外,在使用CMake脚本之前,请务必检查您在查找脚本中使用的任何值是否已实际设置。

另外,请考虑Tsyvarev's advice从不在CMake脚本中设置CMAKE_BINARY_DIR。该变量应该由构建项目的用户设置,而不是由项目本身设置。 CMAKE_BUILD_TYPE也是如此。

答案 1 :(得分:0)

find_package(Curses)期望{CALKE_MODULE_PATH中存在FindCurses.cmake文件。

FindCurses.cmake应该找到curses库并设置所需的变量。您可以在FindCurses.cmake中使用find_path,find_library等其他函数来查找curses库。其他方法是编写.pc文件并使用pkg_check_modules查找此Curses库。

除此之外,这两行都是错误的

  

add_executable(a.out $ {SRC_FILES})

     

target_link_libraries(ncurses-practice $ {CURSES_LIBARIES})

这里add_executable正在创建一个名为a.out的目标,并且您正在为不存在的目标(ncurses-practice)链接CURSES_LIBRARIES。

因此,将add_executable更改为

add_executable(ncurses-practice ${SRC_FILES})