windows下使用msys2安装运行libtcod

前言

出于恶心的 gbk 原因,在中文环境下使用 MSVC 会非常痛苦,且使用 MSVC 编译的 dll 在 gcc/clang 下会出问题。
因此我使用了 MSYS2,然后在这个库上就碰到了问题。
查看了文档之后解决了,遂记录。

首先得保证在 MSYS2 环境下安装 SDL3。

pacman -S mingw-w64-ucrt-x86_64-sdl3 mingw-w64-ucrt-x86_64-sdl3-image mingw-w64-ucrt-x86_64-sdl3-ttf

sdl3-audio需要自己编译安装。

方法一:vcpkg 直接安装

vcpkg会额外安装一次SDL3,暂且不用他的,给camke省点空间。

首先在项目目录里找个地方安装 vcpkg

git clone https://github.com/microsoft/vcpkg
cd vcpkg
./bootstrap-vcpkg.sh

默认情况下直接安装,你一定会遇到这个:

error: in triplet x64-windows: Unable to find a valid Visual Studio instance
Could not locate a complete Visual Studio instance

这个原因在于 vcpkg 默认使用 MSVC 来编译。
这个可以通过设置环境变量来解决。
我的 vcpkg 基本上是现安装现编译的,专门设置永久环境变量太亏了,可以这样:

$env:VCPKG_DEFAULT_TRIPLET = "x64-mingw-dynamic"
$env:VCPKG_DEFAULT_HOST_TRIPLET = "x64-mingw-dynamic"

接下来再运行就没什么问题了。

./vcpkg install libtcod

接下来运行 integrate 查看cmake初始化命令

$ .\vcpkg integrate install
Applied user-wide integration for this vcpkg root.
CMake projects should use: "-DCMAKE_TOOLCHAIN_FILE=../submodules/vcpkg/scripts/buildsystems/vcpkg.cmake"

$  cmake .. -DCMAKE_TOOLCHAIN_FILE=../submodules/vcpkg/scripts/buildsystems/vcpkg.cmake

当然光这些还不够,需要配置一下cmake。
这里是有坑的地方,此时如果你直接 find_package(libtcod CONFIG REQUIRED),你会发现 cmake 找不到包地址。
这个的原因是没有给 vcpkg 设置环境变量,且 cmake 在 MSVC 下找半天库也找不着。
所以得先配置一些地址,让 cmake 知道从哪开始找。

# 工具链配置
set(CMAKE_TOOLCHAIN_FILE "${CMAKE_SOURCE_DIR}/submodules/vcpkg/scripts/buildsystems/vcpkg.cmake"
    CACHE STRING "Vcpkg toolchain file")
# VCPKG的包安装位置
set(VCPKG_INSTALLED_DIR "${CMAKE_SOURCE_DIR}/submodules/vcpkg/installed/x64-mingw-dynamic")
# 设置安装前缀
list(APPEND CMAKE_PREFIX_PATH "${VCPKG_INSTALLED_DIR}/share")

接下来找 libtcod。

find_package(libtcod CONFIG REQUIRED)

最后链接库文件。

target_link_libraries(SDL_T PRIVATE libtcod::libtcod)

当然光这些是不够的,想要运行还需要给 build 文件提供 dll 才可以。
vcpkg 的编译结果都在 install 文件夹下,在上面中我使用 x64-mingw-dynamic 来编译配置,里面就会有这个文件夹,dll 文件都在 bin 的目录下。

# DLL 目录
set(VCPKG_BIN_DIR "${CMAKE_SOURCE_DIR}/submodules/vcpkg/installed/x64-mingw-dynamic/bin")
if(WIN32) # 保证在 windows 下执行
    file(GLOB VCPKG_DLLS "${VCPKG_BIN_DIR}/*.dll") # 查找所有dll
    add_custom_command(TARGET SDL_T POST_BUILD  # 全部复制过去
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
            ${VCPKG_DLLS}
            $<TARGET_FILE_DIR:SDL_T>
        COMMENT "Copying all required DLLs to output directory" # 成功就输出
        )
endif()

之后再 build 运行,就可以运行成功了。

方法二:用预编译好的配置

库作者很贴心的提供了预编译好的版本,我们运行需要.dll,所以下载 msvc 编译版本扔到项目里。
接下来在cmake里链接该库:

set(CMAKE_EXPORT_COMPILE_COMMANDS True)
# 我扔在了 lib/libtcod 下
set(LIBTCOD_DIR ${CMAKE_SOURCE_DIR}/lib/libtcod)
set(LIBTCOD_INCLUDE_DIR ${LIBTCOD_DIR}/include)
set(LIBTCOD_LIB_DIR ${LIBTCOD_DIR}/bin)

# libtcod需要 SDL3
find_package(SDL3 REQUIRED)

add_executable(SDL_T src/main.cpp)

if (WIN32)
    # 移动 dll
    file(COPY ${LIBTCOD_DIR}/bin/libtcod.dll DESTINATION ${CMAKE_BINARY_DIR})
    # 移动 img 图片资源
    file(COPY ${CMAKE_SOURCE_DIR}/img/ DESTINATION ${CMAKE_BINARY_DIR}/img)
endif()

# libtcod
target_include_directories(SDL_T PRIVATE ${LIBTCOD_INCLUDE_DIR})
# SDL3
target_link_libraries(SDL_T PRIVATE SDL3::SDL3)

if (WIN32)
    # Windows(.dll)
    target_link_libraries(SDL_T PRIVATE ${LIBTCOD_LIB_DIR}/libtcod.dll)
endif()

编译运行之后你会发现还需要 utf8proc.dll

简单搜索之后可以发现 MSYS2里存在,安装一个,然后手动从 bin 目录下挪到 build 文件里就好。

$ pacman -Ss utf8proc
clangarm64/mingw-w64-clang-aarch64-libutf8proc 2.10.0-1
    C library for processing UTF-8 encoded Unicode strings (mingw-w64)
mingw64/mingw-w64-x86_64-libutf8proc 2.10.0-1
    C library for processing UTF-8 encoded Unicode strings (mingw-w64)
ucrt64/mingw-w64-ucrt-x86_64-libutf8proc 2.10.0-1 [已安装]
    C library for processing UTF-8 encoded Unicode strings (mingw-w64)
clang64/mingw-w64-clang-x86_64-libutf8proc 2.10.0-1
    C library for processing UTF-8 encoded Unicode strings (mingw-w64)

之后运行就没什么大问题了。

posted @ 2025-07-07 18:30  ChickenRice  阅读(89)  评论(0)    收藏  举报