FreeType库和“Undefined reference to FT_Init_FreeType”

9

我以前只会PHP,这是我第一次接触C/C++(所以请对我宽容点)。我正在按照这个教程写一个使用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

有什么想法吗?
1个回答

20

这些是链接错误。如果示例程序包含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

1
成功了!谢谢!我原本以为必要的文件是通过 includes 选项链接的。我想我不是很理解什么是 library。我原本以为它只是一组源代码文件,这就是为什么我认为 '-I/usr/include/freetype2' 就足够了。要学的东西还有很多... - David Jones
@David 很高兴能够提供帮助。是的,让一个C程序编译和链接可能会很麻烦。这也是解释型语言变得如此流行的一个强有力的原因! - Scooter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接