如何在 Cmake 中 link curses.h?

How to link curses.h in Cmake?

我知道这可能是个愚蠢的问题,但我看不透,我在这里搜索了其他答案,与我的答案非常接近,但是,我仍然不明白该怎么做.

问题是我无法编译在 Windows 中使用 curses.h 的 'C' 程序(我正在使用带有 MinGW 的 Clion),当我尝试这样做时,它为 curses.h 中的函数提供 "undefined reference"(例如 'initscr'、'clear'、...)。

通过 MinGW 安装管理器我安装了 "mingw-32-libpdcurses"(有两个可用,有两个不同 类:dev 和 dll;我安装了 dll 一个)。

我使用的 CMAKE 文件是这样的:

cmake_minimum_required(VERSION 3.3)
project(Project1)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Werror -lpdcurses")

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")

file(GLOB Project1_SRC
        "*.h"
        "*.c"
        )

add_executable(Project1 ${Project1_SRC})

我应该更改什么才能使其与 curses.h 一起编译?

基本上与使用 CMake 定位和集成 any third-party 库的方式相同:使用打包的 Find___.cmake 模块之一。

这些位于 CMake 安装目录的 share/cmake-X.Y/Modules 中。检查文件本身以获取其单独的文档,并 cmake --help-command find_package 了解如何调用它们的详细信息。

我还没有在 MinGW 上使用 PDCurses 专门尝试过以下操作,但如果它不起作用,那会向 Kitware(CMake 的制造商)报告一个明确的错误:

find_package( Curses REQUIRED )
include_directories( ${CURSES_INCLUDE_DIRS} )
target_link_libraries( Project1 ${CURSES_LIBRARIES} )

以下变量被适当设置,告诉你哪个header可用:

  • CURSES_HAVE_CURSES_H 对于 curses.h
  • CURSES_HAVE_NCURSES_H 对于 ncurses.h
  • CURSES_HAVE_NCURSES_NCURSES_H 对于 ncurses/ncurses.h
  • CURSES_HAVE_NCURSES_CURSES_H 对于 ncurses/curses.h

补充建议:

file(GLOB Project1_SRC
        "*.h"
        "*.c"
        )

不要那样做。

引用该函数的文档:

We do not recommend using GLOB to collect a list of source files from your source tree. If no CMakeLists.txt file changes when a source is added or removed then the generated build system cannot know when to ask CMake to regenerate.


set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")

也不要那样做。

您不希望 任何 生成的文件最终出现在您的 source 目录中(它们会妨碍您的版本控制系统,或者更糟的是,实际签入存储库)。您想在 binary 目录中生成所有内容,干净利落。