如何在 Cmake 中 link curses.h?
How to link curses.h in Cmake?
我知道这可能是个愚蠢的问题,但我看不透,我在这里搜索了其他答案,与我的答案非常接近,但是,我仍然不明白该怎么做.
问题是我无法编译在 Windows 中使用 curses.h 的 'C' 程序(我正在使用带有 MinGW 的 Clion),当我尝试这样做时,它为 curses.h 中的函数提供 "undefined reference"(例如 '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})
我应该更改什么才能使其与 curses.h 一起编译?
基本上与使用 CMake 定位和集成 any third-party 库的方式相同:使用打包的 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} )
以下变量被适当设置,告诉你哪个header可用:
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"
)
不要那样做。
引用该函数的文档:
We do not recommend using GLOB to collect a list of source files from your source tree. If no CMakeLists.txt file changes when a source is added or removed then the generated build system cannot know when to ask CMake to regenerate.
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
也不要那样做。
您不希望 任何 生成的文件最终出现在您的 source 目录中(它们会妨碍您的版本控制系统,或者更糟的是,实际签入存储库)。您想在 binary 目录中生成所有内容,干净利落。
我知道这可能是个愚蠢的问题,但我看不透,我在这里搜索了其他答案,与我的答案非常接近,但是,我仍然不明白该怎么做.
问题是我无法编译在 Windows 中使用 curses.h 的 'C' 程序(我正在使用带有 MinGW 的 Clion),当我尝试这样做时,它为 curses.h 中的函数提供 "undefined reference"(例如 '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})
我应该更改什么才能使其与 curses.h 一起编译?
基本上与使用 CMake 定位和集成 any third-party 库的方式相同:使用打包的 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} )
以下变量被适当设置,告诉你哪个header可用:
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"
)
不要那样做。
引用该函数的文档:
We do not recommend using GLOB to collect a list of source files from your source tree. If no CMakeLists.txt file changes when a source is added or removed then the generated build system cannot know when to ask CMake to regenerate.
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
也不要那样做。
您不希望 任何 生成的文件最终出现在您的 source 目录中(它们会妨碍您的版本控制系统,或者更糟的是,实际签入存储库)。您想在 binary 目录中生成所有内容,干净利落。