在 Linux 和 Windows 中启用诅咒

Enabling curses in both Linux and Windows

我正在用 C++ 开发一个小项目,我正在使用 curses 作为用户界面。我能够很好地让它在我的 arch-linux 安装中工作,因为设置 ncurses 在那里工作非常简单。但是我的 cmake 设置在 Linux 下运行良好,我无法在 Windows.

下正常运行

这是我的CMakeList.txt

cmake_minimum_required(VERSION 3.9)
project(fighting_pit)

find_package(Curses REQUIRED)
include_directories(${CURSES_INCLUDE_DIR})

set(CMAKE_CXX_STANDARD 11)

include_directories( ./include)
include_directories( ./src)
add_executable(fighting_pit
    include/Arena.h
    include/cursor.h
    include/Player.h
    include/spell.h
    include/Turns.h
    include/weapon.h
    include/Draw.h
    src/Arena.cpp
    src/cursor.cpp
    src/Player.cpp
    src/spell.cpp
    src/Turns.cpp
    src/weapon.cpp
    src/Draw.cpp
    main.cpp )

target_link_libraries(fighting_pit ${CURSES_LIBRARIES})

我尝试了几种方法使其在 Windows 上也能正常工作。

1。下载资源

我尝试使用 mingw32-make 构建 pdcurses。它创建了 pdcurses.a 我将它添加到与项目相同的位置,但它仍然显示找不到 curses 库。

2。通过 mingw32-get

下载

我使用了 mingw 的安装管理器,让它下载 libpdcurses 的 .dll 和开发包。只是尝试通过 clion 运行 cmake 显示它仍然没有找到。所以我将它复制到 windows32 和项目文件夹中,但它仍然没有帮助。

我不知道我应该做什么。不幸的是,我既不是 C++ 用户,也不是 Windows 用户。

我需要构建一个 cross-platform 项目,该项目在 Linux 和 MacOS 上使用 ncurses,但在 Windows 上使用 pdcurses。 curses 的某些变体通常安装在 Linux 的流行发行版中。 ncurses 也可以在 MacOS 上使用。 Windows 的情况并非如此。我的解决方案是下载 pdcurses sources 并编写用于在 Windows 上构建它的 cmake 脚本。 if (WIN32 or MSVC) 构建 pdcurses else() 查找 ncurses。您可能还想创建一个代理 header,根据平台 #includes pdcurses 或 ncurses。

克隆 GitHub 存储库后,我将 . 中的 header、./pdcurses 中的 C 文件、./wincon 中的源代码复制到我项目中的一个新目录。然后我写了一个 CMakeLists.txt 文件来将所有这些文件编译成一个库。它看起来像这样:

cmake_minimum_required(VERSION 3.2)

add_library(PDcurses
         # all of the sources
         addch.c
         addchstr.c
         addstr.c
         attr.c
         beep.c
         # ...
)
target_include_directories(PDcurses
        PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}
)

如果目标是 windows,我的主 CMakeLists.txt 文件编译了 pdcurses 源。

if(WIN32 OR MSVC)
        add_subdirectory(pdcurses)
        target_link_libraries(MyTarget
                PRIVATE
                PDcurses
        )
else()
        # find ncurses and use that
endif()

PDCurses 在大多数情况下似乎(或多或少)drop-in 替代 ncurses。我能够使用 curses 在我的 Mac 上编译 PDcurses 附带的示例程序,没有任何问题。