如何在Cmake中链接curses.h?

时间:2016-02-02 17:10:42

标签: c windows cmake undefined-reference pdcurses

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

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

通过MinGW Installation Manager我安装了“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进行编译,我应该在其中进行哪些更改?

1 个答案:

答案 0 :(得分:5)

基本上与使用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} )

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

    {li> CURSES_HAVE_CURSES_H curses.h {li> CURSES_HAVE_NCURSES_H ncurses.h {li> CURSES_HAVE_NCURSES_NCURSES_H ncurses/ncurses.h {li> 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}")

也不要这样做。

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