首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >CMake 3.9.1: Cmake不查找库ncurse

CMake 3.9.1: Cmake不查找库ncurse
EN

Stack Overflow用户
提问于 2017-09-19 02:29:36
回答 2查看 1.3K关注 0票数 1

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

我在SDL2库中使用了这个模板,没有问题,我所做的唯一修改就是将"SDL2“与set(CURSES_NEED_NCURSES TRUE)行一起更改为”set(CURSES_NEED_NCURSES TRUE)“。(对于任何想知道的人来说,如果没有这句话,这仍然是失败的)

是的,我已经安装了它,而且我可以很容易地用gcc main.c -lncurses编译它,而不会有问题。

代码语言:javascript
代码运行次数:0
运行
复制
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})
EN

回答 2

Stack Overflow用户

发布于 2017-09-19 09:22:42

find_package(Curses)将期望FindCurses.cmake文件出现在您的CMAKE_MODULE_PATH中。

FindCurses.cmake应该找到诅咒库并设置所需的变量。您可以使用find_path、find_library等其他函数在此FindCurses.cmake中查找诅咒库。另一种方法是编写一个.pc文件并使用pkg_check_modules查找这个诅咒库。

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

add_executable(a.out ${SRC_FILES}) target_link_libraries(ncurses-practice ${CURSES_LIBARIES})

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

所以将您的add_executable更改为

代码语言:javascript
代码运行次数:0
运行
复制
add_executable(ncurses-practice ${SRC_FILES})
票数 2
EN

Stack Overflow用户

发布于 2017-09-19 09:09:40

您的代码中有一个bug:

代码语言:javascript
代码运行次数: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模块的FindCurses文档,而源代码是可以在Kitware的gitlab上找到

从这一点你可以看出,逻辑并不是很聪明。确保本地安装诅咒的路径与脚本所期望的相对应。如果您认为脚本的查找机制可以改进,可以考虑使用改进的版本打开一个拉请求。

此外,在CMake脚本中使用这些值之前,请确保检查从find脚本中使用的任何值是否实际被设置。

另外,请考虑齐瓦列夫的建议不要从CMake脚本中设置CMAKE_BINARY_DIR。这个变量应该由构建项目的用户设置,而不是项目本身。CMAKE_BUILD_TYPE也是如此。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46290897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档