2012-09-07 122 views
3

從PHP的到來,這是我用C/C++初體驗(這樣下去容易對我)。我遵循this tutorial使用FreeType庫編寫一個簡單的腳本。下面編譯得很好:FreeType庫和「未定義參考FT_Init_FreeType」

#include <ft2build.h> 
#include FT_FREETYPE_H 

main() { 
    FT_Library library; 
    FT_Face face; 
} 

這告訴我,FreeType庫對編譯器來說是隨時可用的。然而,一旦我嘗試使用任何方法,事情就會中斷。例如,採取下面的腳本:

#include <ft2build.h> 
#include FT_FREETYPE_H 

main() { 

    int error; 

    FT_Library library; 
    error = FT_Init_FreeType(&library); 
    if (error) {} 

    FT_Face face; 
    error = FT_New_Face(library, "/usr/share/fonts/truetype/arial.ttf", 0, &face); 
    if (error == FT_Err_Unknown_File_Format) { 
     printf("Font format is unsupported"); 
    } else if (error) { 
     prinft("Font file is missing or corrupted"); 
    } 
} 

這個腳本編譯時產生以下錯誤:

#gcc render.c -I/usr/include/freetype2 
/tmp/cc95255i.o: In function `main': 
render.c:(.text+0x10): undefined reference to `FT_Init_FreeType' 
render.c:(.text+0x30): undefined reference to `FT_New_Face' 
collect2: ld returned 1 exit status 

任何想法?

回答

10

這些是鏈接錯誤。如果他們在演示中包含Makefile,那麼最好使用它。否則,您需要將-L和-l選項添加到您的編譯命令行,以便編譯器(實際上是鏈接器)知道在哪裏可以找到FreeType庫。

-L選項提供了庫的代碼存在的路徑。例如,

-L/usr/local/lib 

而-l選項給出了庫的名稱。用-l選項命名的庫以縮寫形式指定,即您將前面的「lib」和後面的「.a」分開。因此,舉例來說,如果FreeType庫存儲在文件libfreetype.a,它會在-l選項顯示爲

-lfreetype 

例如爲:

gcc render.c -I/usr/include/freetype2 -L/usr/local/lib -lfreetype 
+0

它的工作!謝謝!我認爲必要的文件通過* includes *選項鍊接。我想我不太瞭解*庫*是什麼。我認爲這只是源代碼文件的集合,這就是爲什麼我認爲'-I/usr/include/freetype2'就足夠了。很多學習... –

+0

@大衛很高興我可以得到一些幫助。是的,只是獲得一個程序來編譯和鏈接在C可以是一個考驗。解釋性語言變得如此受歡迎只有一個,但強大的原因! – Scooter