在您标记为重复之前,我已经在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})
答案 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})