如何在Cmake中链接curses.h?

How to link curses.h in Cmake?

提问人:Aster 提问时间:2/3/2016 更新时间:2/3/2016 访问量:5689

问:

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

问题是我无法在 Windows 中编译使用 curses.h 的“C”程序(我正在将 Clion 与 MinGW 一起使用),当我尝试这样做时,它会为 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 编译?

c windows cmake undefined-reference pdcurses

评论

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

答:

6赞 DevSolar 2/3/2016 #1

与查找任何第三方库并将其与 CMake 集成的方式基本相同:使用打包的模块之一。Find___.cmake

它们位于 CMake 安装目录中。检查文件本身的各个文档,以及如何调用它们的详细信息。share/cmake-X.Y/Modulescmake --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}")

也不要那样做。

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

评论

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