如何在Cmake中链接curses.h?

Ast*_*ter 3 c windows cmake pdcurses undefined-reference

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

问题是我无法编译在Windows中使用curses.h的'C'程序(我正在使用Clion和MinGW),当我尝试这样做时,它为curses.h中的函数提供了"未定义的引用" (例如'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})
Run Code Online (Sandbox Code Playgroud)

我应该更改它以便使用curses.h进行编译?

Dev*_*lar 5

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

它们位于share/cmake-X.Y/ModulesCMake安装目录中.检查文件本身的各个文档,以及cmake --help-command find_package有关如何调用它们的详细信息.

我没有在MinGW上专门针对PDCurses尝试以下内容,但是如果它不起作用,那就是向Kitware(CMake的制造商)发送一个明确的错误报告:

find_package( Curses REQUIRED )
include_directories( ${CURSES_INCLUDE_DIRS} )
target_link_libraries( Project1 ${CURSES_LIBRARIES} )
Run Code Online (Sandbox Code Playgroud)

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

  • 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"
        )
Run Code Online (Sandbox Code Playgroud)

不要那样做.

引用该函数的文档:

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


set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
Run Code Online (Sandbox Code Playgroud)

不要这样做.

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