2015-04-23 72 views
-1

我正在使用SDL_TFF庫並編譯它,但可執行文件不會直接運行,除非從終端運行。如果我註釋掉SDL_TFF代碼,它將正常運行。可執行文件除非使用終端,否則不會在windows中運行

有誰知道什麼可能導致這個問題?

編輯:

#include <stdio.h> 
#include <SDL.h> 
#include <SDL_ttf.h> //version 2.0.12 

TTF_Font*   Font; 
SDL_DisplayMode  Desktop_Display_Mode; 
SDL_Window*   Window; 
SDL_Surface*  Window_surface; 
SDL_Renderer*  Renderer; 

bool load_font() 
{ 
    //Font = TTF_OpenFont("fonts\\NotoSans-Bold.ttf", 16); 
    Font = TTF_OpenFont("fonts\\NotoSansCJKjp-Bold.otf", 18); 
    if (Font == NULL) 
    { 
     SDL_LogCritical(
      SDL_LOG_CATEGORY_APPLICATION, 
      "Count not load font! TTF_Error: %s\n", TTF_GetError() 
     ); 
     return false; 
    } 
    return true; 
} 

bool initialize() 
{ 

    // Initialize SDL Library 
    if(SDL_Init(SDL_INIT_VIDEO) < 0) 
    { 
     SDL_LogCritical(
      SDL_LOG_CATEGORY_APPLICATION, 
      "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() 
     ); 
     return false; 
    } 

    // Initialize SDL_ttf library 
    if (TTF_Init() != 0) 
    { 
     SDL_LogCritical(
      SDL_LOG_CATEGORY_APPLICATION, 
      "SDL_ttf could not initialize! TTF_Error: %s\n", TTF_GetError() 
     ); 
     return false; 
    } 

    // Load Font --------------------------------------------------------------- 
    if (!load_font()) 
    { 
     return false; 
    } 

    // Get Desktop Display Mode 
    if (SDL_GetDesktopDisplayMode(0, &Desktop_Display_Mode) != 0) 
    { 
     SDL_LogCritical(
      SDL_LOG_CATEGORY_APPLICATION, 
      "SDL could not get Desktop Display Mode! SDL_Error: %s\n", 
      SDL_GetError() 
     ); 
     return false; 
    } 

    // Create Window 
    Window = SDL_CreateWindow( 
     "SDL Test", 
     SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 
     Desktop_Display_Mode.w, Desktop_Display_Mode.h, 
     SDL_WINDOW_BORDERLESS //Flags 
     ); 

    if(Window == NULL) 
    { 
     SDL_LogCritical(
      SDL_LOG_CATEGORY_APPLICATION, 
      "Window could not be created! SDL_Error: %s\n", 
      SDL_GetError() 
     ); 
     return false; 
    } 

    Renderer = SDL_CreateRenderer(Window, -1, 
     SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC 
    ); 

    if (Renderer == NULL) 
    { 
     SDL_LogCritical(
      SDL_LOG_CATEGORY_APPLICATION, 
      "Renderer could not be created! SDL_Error: %s\n", 
      SDL_GetError() 
     ); 
     return false; 
    } 

    return true; 

} 

bool clear_screen() 
{ 
    if (SDL_SetRenderDrawColor(Renderer, 0x00, 0x00, 0x00, 0xFF) != 0) 
    { 
     SDL_LogCritical(
      SDL_LOG_CATEGORY_APPLICATION, 
      "Could not set render draw color! SDL_Error: %s\n", 
      SDL_GetError() 
     ); 
     return false; 
    } 
    if (SDL_RenderClear(Renderer) != 0) 
    { 
     SDL_LogCritical(
      SDL_LOG_CATEGORY_APPLICATION, 
      "Could not clear the renderer! SDL_Error: %s\n", 
      SDL_GetError() 
     ); 
     return false; 
    } 
    return true; 
} 

int main(int argc, char* args[]) 
{ 
    SDL_Log("Started."); 

    bool running = initialize(); 


    SDL_Color text_color = {255, 255, 255}; 

    const char* text_string; 
    text_string = "A journey of a thousand miles begins with a single step.\n こんにちは"; 

    SDL_Rect text_dest; 
    text_dest.x = 100; 
    text_dest.y = 100; 
    text_dest.w = 0; 
    text_dest.h = 0; 

    if (TTF_SizeUTF8(Font, text_string, &text_dest.w, &text_dest.h) != 0) 
    { 
     SDL_LogCritical(
      SDL_LOG_CATEGORY_APPLICATION, 
      "Unable to get text size! TTF_Error: %s\n", TTF_GetError() 
     ); 
     running = false; 
    } 

    SDL_Surface* text_surface = NULL; 
    text_surface = TTF_RenderUTF8_Solid(
     Font, 
     text_string, 
     text_color 
    ); 

    if (text_surface == NULL) 
    { 
     SDL_LogCritical(
      SDL_LOG_CATEGORY_APPLICATION, 
      "Unable to render text! SDL_Error: %s\n", 
      TTF_GetError() 
     ); 
     running = false; 
    } 

    SDL_Texture* text_texture = NULL; 
    text_texture = SDL_CreateTextureFromSurface(Renderer, text_surface); 
    if (text_texture == NULL) 
    { 
     SDL_LogCritical(
      SDL_LOG_CATEGORY_APPLICATION, 
      "Unable to render text! SDL_Error: %s\n", 
      TTF_GetError() 
     ); 
     running = false; 
    } 

    // MAIN LOOP =============================================================== 
    SDL_Event event; 
    while (running) 
    { 

     // Clear the screen 
     if (!clear_screen()) 
     { 
      break; 
     } 

     // Check for events 
     if (SDL_PollEvent(&event)) 
     { 
      // Check for the quit event 
      if (event.type == SDL_QUIT) 
      { 
       SDL_Log("Quit."); 
       break; 
      } 
     } 

     // Apply the text 
     if (SDL_RenderCopy(Renderer, text_texture, NULL, &text_dest) != 0) 
     { 
      SDL_LogCritical(
       SDL_LOG_CATEGORY_APPLICATION, 
       "Unable to draw text! SDL_Error: %s\n", 
       SDL_GetError() 
      ); 
      break; 
     } 
     //Update Window 
     SDL_RenderPresent(Renderer); 

    } 

    //Destroy Window 
    SDL_DestroyWindow(Window); 
    SDL_DestroyRenderer(Renderer); 

    //Quit SDL subsystems 
    TTF_Quit(); 
    SDL_Quit(); 

    SDL_Log("Ended."); 

    return 0; 
} 

EDIT2:我測試了看一遍,似乎功能TTF_OpenFont()引起的問題。只要我不調用這個函數,exe就會正常運行。

+0

我懷疑你會得到任何幫助沒有更多的細節,你的代碼等 – Zammalad

+0

作出最小的示例程序,你不能啓動。我們不需要代碼的其他部分。 – HolyBlackCat

+0

就像我說過的,如果從終端執行,我會運行,所以我一直在繼續編輯程序。我已經刪除了與顯示字體樣本無關的所有內容,並提供了相關信息。 – trilioth

回答

0

已解決!

這是我執行命令行程序的方式:「\ BIN \ MYPROG.EXE」

因此相對文件路徑是不正確,因爲「\ BIN \字體...」是不存在的。由於我沒有實現SDL_LogSetOutputFunction來將日誌寫入文件,並且stdout顯然被抑制了,所以我看不到我必須得到錯誤消息,指出文件未被加載。

相關問題