Windows下CLion中使用SDL_ttf加载字体出现链接错误求助
问题描述
在Windows系统的CLion中使用SDL_ttf在游戏循环内显示文本:
- 标准SDL已安装在
C:/Programs/SDL/SDL2-2.30.2,SDL_ttf安装在C:/Programs/SDL/SDL2_ttf-2.22.0 - CMakeLists.txt配置后编译无报错,可正常引入
SDL_ttf.h - 仅定义
TTF_Font* font时程序正常运行,调用TTF_OpenFont加载字体时出现链接错误:
C:\Program Files\JetBrains\CLion 2024.1\bin\mingw\bin/ld.exe: C:/Program Files/SDL/SDL2_ttf-2.22.0/x86_64-w64-mingw32/lib/libSDL2_ttf.a(libSDL2_ttf_la-hb-uniscribe.o): in function
_hb_generate_unique_face_name': /Users/valve/release/SDL2_ttf/SDL2_ttf-2.22.0-source/foo-x64/../external/harfbuzz/src/hb-uniscribe.cc:300: undefined reference to__imp_UuidCreate'
- 改用SDL_ttf的.dll文件后,错误变为:
undefined reference toTTF_OpenFont'`
解决方案
1. 解决__imp_UuidCreate未定义错误
该错误是因为SDL_ttf依赖的harfbuzz库需要调用Windows系统的Rpcrt4库(提供UUID生成功能),需在CMakeLists.txt中显式链接该库:
# 链接Rpcrt4系统库 target_link_libraries(你的项目名称 PRIVATE Rpcrt4)
2. 解决动态库模式下TTF_OpenFont未定义错误
如果使用SDL_ttf的动态库(.dll),需确保以下几点:
- CMake中链接SDL_ttf的动态导入库(通常是
libSDL2_ttf.dll.a),而非静态库libSDL2_ttf.a - 在引入SDL_ttf头文件前定义
SDL2TTF_SHARED宏,告知编译器使用动态链接符号:#define SDL2TTF_SHARED #include <SDL_ttf.h> - 将SDL_ttf的
SDL2_ttf.dll文件复制到项目可执行文件所在目录,或添加到系统PATH环境变量,保证运行时能加载动态库
3. 参考CMakeLists.txt完整配置
确保CMake正确定位SDL和SDL_ttf,以下是示例配置:
cmake_minimum_required(VERSION 3.20) project(你的项目名称) set(CMAKE_CXX_STANDARD 17) # 指定SDL和SDL_ttf的cmake配置路径 set(SDL2_DIR "C:/Programs/SDL/SDL2-2.30.2/x86_64-w64-mingw32/lib/cmake/SDL2") set(SDL2_ttf_DIR "C:/Programs/SDL/SDL2_ttf-2.22.0/x86_64-w64-mingw32/lib/cmake/SDL2_ttf") find_package(SDL2 REQUIRED) find_package(SDL2_ttf REQUIRED) add_executable(你的项目名称 main.cpp) # 链接所有依赖库 target_link_libraries(你的项目名称 PRIVATE SDL2::SDL2 SDL2::SDL2main SDL2_ttf::SDL2_ttf Rpcrt4)
内容的提问来源于stack exchange,提问作者Dee Vee
相关产品推荐
相关产品推荐

