SDL_ttf“Couldn't load font file”with SDL2 in c++

wlp8pajw  于 2023-05-08  发布在  其他
关注(0)|答案(4)|浏览(264)

下面的代码用于在SDL2应用程序中绘制一些文本。当我构建和运行时,我总是看到TTF_OpenFont() Failed: Couldn't load font file的错误。我尝试了以下方法:

  • 已确保字体文件位于运行程序的当前目录中。事实上,我已经把字体放在了几乎所有可以运行程序的目录中,并尝试使用绝对路径。
  • 设置不同权限并拥有文件
  • 使用SDL_RWFromFile单独打开文件,如下所述:http://www.gamedev.net/topic/275525-sdl_ttf-weirdness/
  • 已下载并重新编译较新版本的SDL_ttf(2.0.14)

下面是我的代码:

void SDLRenderer::drawText(
    const Vector2d& pos,
    string message,
    const Color& color)
{
  if(!TTF_WasInit()) {
    cerr << "TTF_Init failed " << TTF_GetError() << endl;
    exit(1);
  }
  TTF_Font* fixed = TTF_OpenFont("./DejaVuSansMono.ttf", 16);
  if (fixed == NULL) {
    cerr << "TTF_OpenFont() Failed: " << TTF_GetError() << endl;
    TTF_Quit();
    SDL_Quit();
    exit(1);
  }
  ...

我还从这段代码的类的构造函数调用TTF_Init()。我也有点不确定如何进一步调试,因为gdb甚至在出错后都不给予回溯,似乎也不让我进入TTF_OpenFont函数。

gstyhher

gstyhher1#

我遇到了这个问题,它是由链接到SDL_ttf库的错误版本引起的。我使用的是SDL 2.0,但我链接的是libSDL_ttf.so而不是libSDL2_ttf.solibSDL_ttf.so适用于SDL 1.2,与SDK 2.0不兼容。
我原来的命令行是:

$ gcc -o showfont showfont.c `sdl2-config --cflags --libs` -lSDL_ttf
$ ./showfont /usr/share/fonts/truetype/freefont/FreeSans.ttf
Couldn't load 18 pt font from /usr/share/fonts/truetype/freefont/FreeSans.ttf: Couldn't load font file

我通过链接到libSDL2_ttf.so来修复它:

$ gcc -o showfont showfont.c `sdl2-config --cflags --libs` -lSDL2_ttf
$ ./showfont /usr/share/fonts/truetype/freefont/FreeSans.ttf
Font is generally 21 big, and string is 21 big

showfont.c程序是一个example included with SDL_ttf

dz6r00yl

dz6r00yl2#

我的想法可能属于评论,但我没有足够的声誉。您可以通过显式设置当前工作目录(Linux上的unistd. h中的chdir,或Windows上的windows. h中的SetCurrentDirectory)来确保您位于正确的目录中。我不认为你需要在文件名中包含./
我记得在再次调用TTF_InitTTF_QuitTTF_Init时,SDL_ttf出现问题。这可能不会引起你的问题,但我建议在程序开始时只执行一次TTF_Init,在程序结束时执行一次TTF_Quit,而不是每次运行构造函数时。
如果这不起作用,请考虑构建一个SDL_ttf的调试版本,它将更好地与GDB配合使用。

db2dz4w8

db2dz4w83#

我也遇到过同样的问题,并通过输入字体的完整路径来解决它。
而不是只传递字符串“./font.ttf”
我使用:“/User/MyUsername/Projects/MyProject/font.tff”希望这对您有帮助!

8i9zcol2

8i9zcol24#

当您使用相对路径时,该路径是相对于可执行文件的。如果可执行文件位于构建目录中,则可能必须使用"../DejaVuSansMono.ttf"

相关问题