You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows下SDL2项目使用SDL2_ttf相对路径加载.ttf字体失败求助

SDL2 TTF_OpenFont 相对路径加载字体失败问题

在Windows上搭建了一个简单的SDL2项目,希望在SDL2窗口中显示文本。使用绝对路径可正常加载字体,但调用TTF_OpenFont使用相对路径时返回nullptr。尝试过基于cpp文件和可执行文件的两种路径,也替换了Windows系统的目录分隔符为\,但均未成功。

项目目录

Project Directory
├─bin
│  └─debug
│      main.exe
│      SDL2.dll
│      SDL2_image.dll
│      SDL2_ttf.dll
│
├─res
│      font.ttf
│
└─src
       main.cpp
       renderwindow.cpp
       renderwindow.hpp

相关代码(renderwindow.cpp)

#include <iostream>
#include <SDL2/SDL.h>
#include <SDL2/SDL_ttf.h>

//...

TTF_Font *font = TTF_OpenFont("../res/font.ttf", 16);
if (font == nullptr)
{
    std::cout << "Font couldn't load." << std::endl;
}

//... 文本渲染相关代码

输出

Font couldn't load.

解决方案

  • 明确相对路径基准:程序中所有文件IO的相对路径都是基于程序运行时的工作目录,而非源码文件所在目录。可以先打印当前工作目录确认:
    #include <windows.h>
    // ...
    char buf[256];
    GetCurrentDirectoryA(256, buf);
    std::cout << "当前工作目录: " << buf << std::endl;
    
  • 调整路径匹配工作目录:
    • 如果工作目录是项目根目录(多数IDE默认配置),使用路径"res/font.ttf"
    • 如果工作目录是bin/debug,使用路径"../../res/font.ttf"(从debug目录向上两级回到项目根,再进入res文件夹)
  • 路径分隔符注意事项:Windows下/和\都支持,但若使用\,C++字符串中需要写成转义形式\\,比如"..\\..\\res\\font.ttf"
  • 排查具体错误:用TTF_GetError()获取更详细的错误信息,帮助定位问题:
    if (font == nullptr)
    {
        std::cout << "字体加载失败: " << TTF_GetError() << std::endl;
    }
    
  • 额外检查:确认res/font.ttf文件存在、文件名拼写正确(Windows不区分大小写,但尽量保持一致)

内容的提问来源于stack exchange,提问作者ywbird

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 20:52:35