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)
之后运行就没什么大问题了。

浙公网安备 33010602011771号