CMake 3.9.1:Cmake 找不到库 ncurses
Posted
技术标签:
【中文标题】CMake 3.9.1:Cmake 找不到库 ncurses【英文标题】:CMake 3.9.1: Cmake not finding library ncurses 【发布时间】:2017-09-19 02:29:36 【问题描述】:在您标记为重复之前,我在 *** 上阅读了 8 个与此类似的不同问题,在其他地方更是如此。如果这些答案中的任何一个解决了我的问题,我就不会发布这个。
我在 SDL2 库中使用了这个完全相同的模板,没有任何问题,我所做的唯一更改是将“SDL2”更改为“Curses”以及 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)
【问题讨论】:
任何错误信息? 可能与错误无关,但是:set(CMAKE_BINARY_DIR ...)
- 从不 设置 CMAKE_BINARY_DIR
变量。许多外部和内部脚本假定它指向***二进制目录。 set(CMake_ncurses-practice_VERSION_MAJOR 1)
- 这里的“CMAKE”应该是大写的。否则变量对 CMake 没有意义。
你的 CMAKE_MODULE_PATH 中有 FindCurses,cmake 吗?
【参考方案1】:
find_package(Curses)
期望 FindCurses.cmake
文件出现在您的 CMAKE_MODULE_PATH 中。
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)
【讨论】:
【参考方案2】:您的代码中有错误:
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”更改为“Curses”
不幸的是,find 脚本不是这样工作的。虽然 CMake 期望良好的查找脚本遵循某些约定,但这些约定比严格的规则更为宽松。因此,您通常不能依赖与一个查找脚本一起使用的代码来与另一个脚本一起使用。
相反,您将始终必须检查要使用的脚本的文档(通常甚至是源代码),并仔细调整周围的代码。
在您的情况下,相关文档是CMake doc for the FindCurses module,而来源是can be found on Kitware's gitlab。
从这里你可以看出逻辑不是很聪明。确保您本地安装 curses 的路径对应于what the script expects。如果您认为脚本的查找机制可以改进,请考虑使用改进版本打开拉取请求。
此外,请确保在您的 CMake 脚本中使用它们之前检查您在查找脚本中使用的任何值是否已实际设置。
另外,请考虑 Tsyvarev's advice 永远不要在 CMake 脚本中设置 CMAKE_BINARY_DIR
。该变量应该由正在构建项目的用户而不是项目本身设置。 CMAKE_BUILD_TYPE
也是如此。
【讨论】:
以上是关于CMake 3.9.1:Cmake 找不到库 ncurses的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows 上使用带有 CMake 的 HDF5 库(错误:“找不到 HDF5”)