【问题标题】:How to link curses.h in Cmake?如何在 Cmake 中链接 curses.h?
【发布时间】:2016-05-11 14:55:41
【问题描述】:

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

问题是我无法在 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 一起编译?

【问题讨论】:

  • 我认为你应该将库添加到CMAKE_EXE_LINKER_FLAGS
  • 嗯...您安装了 dll,但没有安装开发包?我对 MinGW 了解不多,但通常您需要 dev 包来获取头文件。很好奇你得到了一个 linker 错误,而不是关于缺少头文件的编译器错误。确保你没有使用来自不同库版本的头文件,甚至没有使用不同的 curses 发行版。这注定会失败。

标签: c windows cmake undefined-reference pdcurses


【解决方案1】:

您定位和集成任何第三方库与 CMake 的方式基本相同:使用打包的 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} )

根据需要设置以下变量来告诉您哪个标头可用:

  • CURSES_HAVE_CURSES_Hcurses.h
  • CURSES_HAVE_NCURSES_Hncurses.h
  • CURSES_HAVE_NCURSES_NCURSES_Hncurses/ncurses.h
  • CURSES_HAVE_NCURSES_CURSES_Hncurses/curses.h

补充建议:

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

不要那样做。

引用该函数的文档:

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


set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")

也不要这样做。

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

【讨论】:

  • 我将 CMake 文件修改为 this(现在我将在源代码中保留“GLOB”和生成的文件,直到我用 PDcurses 解决问题)现在它可以编译但是当我尝试执行它说我的计算机中没有“libncursesw-6.dll”的程序。如果我尝试执行 PDcurses 的演示之一,它会说我缺少“libpdcurses.dll”。我不知道怎么了。我认为我正确安装了库,如您所见here
  • @Aster:这意味着该库是在 compile 时找到的(因为 CMake 总是提供任何库的完整文件路径),但不是在 run 时间(因为路径信息在二进制文件中丢失)。您可以 a) 扩展库搜索路径(这意味着扩展 Windows 的 %PATH%,或编辑 /etc/ld.so.conf 分别添加到 Linux 上的 /etc/ld.so.conf.d),或者b) 使 CMake 将库的完整路径编译为可执行文件 (set( CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE ))。但是我们在这里谈论的是相当基本的工具链问题;你确定……(待定)
  • (ctd) ...此时您应该摆弄 CMake、Curses、 MinGW,而不是一次更熟悉一个?
  • 非常感谢您的帮助和耐心,我修改了 %PATH% 变量,现在它可以工作了。是的,我可能不应该同时处理很多事情,但我必须为了大学的目的。问题是我开始使用 CLion(使用 CMake)不到一个月,在此之前我从未使用过 CMake 或弄乱过 minGW,我使用的是 Code-Blocks(不使用 CMake)并且更容易构建和编译但是,一旦看到 CLion,我就爱上了它,它是一个了不起的 IDE。再次感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-30
  • 1970-01-01
相关资源
最近更新 更多