2016-04-02 51 views
0

我有以下代碼在SDL2應用程序中繪製一些文本。當我建立並運行時,我一直看到TTF_OpenFont() Failed: Couldn't load font file的錯誤。我試過以下內容:SDL_ttf「無法加載字體文件」與c + +中的SDL2

  • 確保字體文件位於正在運行程序的當前目錄中。實際上,我已經將字體放在程序可以運行的幾乎任何目錄中,並嘗試使用絕對路徑。
  • 設置不同的權限,並擁有該文件
  • 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函數。

回答

0

我的想法可能屬於評論,但我沒有足夠的聲望。您可以通過明確設置當前工作目錄(Linux中unistd.h中的chdir或Windows中windows.h中的SetCurrentDirectory)來確保您位於正確的目錄中。我不認爲你需要在文件名中包含./

我記得SDL_ttf在調用TTF_Init,TTF_Quit,然後再次調用TTF_Init時遇到問題。這可能不會導致你的問題,但我會建議在程序開始時只做一次TTF_Init,並且最後只做一次TTF_Quit,而不是每次構造函數運行。

如果這不起作用,請考慮構建一個可以在GDB上更好的SDL_ttf調試版本。

0

我遇到了這個問題,它是由與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