4

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

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

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

我正在使用的 CMAKEfile 是这样的:

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一起编译,我应该对其进行哪些更改?

4

1 回答 1

5

基本上与您使用 CMake 查找和集成任何第三方库的方式相同:使用其中一个打包Find___.cmake模块。

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

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

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

适当设置以下变量以告诉您哪个标头可用:

  • 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"
        )

不要那样做。

引用该功能的文档:

我们不建议使用 GLOB 从源代码树中收集源文件列表。如果在添加或删除源时没有 CMakeLists.txt 文件更改,则生成的构建系统无法知道何时要求 CMake 重新生成。


set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")

也不要那样做。

您不希望任何生成的文件最终出现在您的目录中(它们会妨碍您的版本控制系统,或者更糟的是,实际上会被签入到存储库中)。您想在二进制目录中生成所有内容,完全不碍事。

于 2016-02-02T17:20:10.470 回答