下面的代码用于在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函数。
4条答案
按热度按时间gstyhher1#
我遇到了这个问题,它是由链接到SDL_ttf库的错误版本引起的。我使用的是SDL 2.0,但我链接的是
libSDL_ttf.so
而不是libSDL2_ttf.so
。libSDL_ttf.so
适用于SDL 1.2,与SDK 2.0不兼容。我原来的命令行是:
我通过链接到
libSDL2_ttf.so
来修复它:showfont.c
程序是一个example included with SDL_ttf。dz6r00yl2#
我的想法可能属于评论,但我没有足够的声誉。您可以通过显式设置当前工作目录(Linux上的unistd. h中的
chdir
,或Windows上的windows. h中的SetCurrentDirectory
)来确保您位于正确的目录中。我不认为你需要在文件名中包含./
。我记得在再次调用
TTF_Init
、TTF_Quit
和TTF_Init
时,SDL_ttf出现问题。这可能不会引起你的问题,但我建议在程序开始时只执行一次TTF_Init
,在程序结束时执行一次TTF_Quit
,而不是每次运行构造函数时。如果这不起作用,请考虑构建一个SDL_ttf的调试版本,它将更好地与GDB配合使用。
db2dz4w83#
我也遇到过同样的问题,并通过输入字体的完整路径来解决它。
而不是只传递字符串“./font.ttf”
我使用:“/User/MyUsername/Projects/MyProject/font.tff”希望这对您有帮助!
8i9zcol24#
当您使用相对路径时,该路径是相对于可执行文件的。如果可执行文件位于构建目录中,则可能必须使用
"../DejaVuSansMono.ttf"
。