You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用g++编译依赖FreeType库的程序时出现未定义引用错误

问题

我正在为游戏开发项目编写Makefile,已将所有代码编译为静态库bingus.a(我的引擎)。现在尝试构建示例程序时,发现FreeType静态库无法正确链接。

编译错误输出

C:\Projects\Games\bingus>make examples
g++ -o hello_window -Wall -Iinclude -Isrc examples/hello_window.cpp bingus.a -Llib -lglfw3 -lgdi32 -lopengl32 -lfreetype
bingus.a(renderer.o):renderer.cpp:(.text+0x11f): undefined reference to `FT_Init_FreeType'
bingus.a(renderer.o):renderer.cpp:(.text+0x234d): undefined reference to `FT_New_Face'
bingus.a(renderer.o):renderer.cpp:(.text+0x23b2): undefined reference to `FT_Set_Pixel_Sizes'
bingus.a(renderer.o):renderer.cpp:(.text+0x23ee): undefined reference to `FT_Load_Char'
bingus.a(renderer.o):renderer.cpp:(.text+0x25f0): undefined reference to `FT_Load_Char'
bingus.a(renderer.o):renderer.cpp:(.text+0x281f): undefined reference to `FT_Done_Face'
collect2.exe: error: ld returned 1 exit status
make: *** [hello_window] Error 1

完整Makefile内容

# Define target platform
PLATFORM    ?= DESKTOP
 
# Define paths
SOURCE_PATH ?= src
INCLUDE_PATH    ?= include
LIB_PATH    ?= lib
EXAMPLES_PATH   ?= examples
OUTPUT_PATH ?= out
 
#Define includes
BINGUS_INCLUDES =   -I$(INCLUDE_PATH) \
            -I$(SOURCE_PATH)
 
#Define engine object files
BINGUS_SRCS =   $(SOURCE_PATH)/bingus.cpp \
        $(SOURCE_PATH)/debug.cpp \
        $(SOURCE_PATH)/entity.cpp \
        $(SOURCE_PATH)/glad.c \
        $(SOURCE_PATH)/input.cpp \
        $(SOURCE_PATH)/math.cpp \
        $(SOURCE_PATH)/renderer.cpp \
        $(SOURCE_PATH)/shader.cpp \
        $(SOURCE_PATH)/texture.cpp \
        $(SOURCE_PATH)/ui.cpp \
        $(SOURCE_PATH)/window.cpp

BINGUS_OBJS =   bingus.o \
        debug.o \
        entity.o \
        glad.o \
        input.o \
        math.o \
        renderer.o \
        shader.o \
        texture.o \
        ui.o \
        window.o

# Define compiler vars
CC = g++
AR = ar
CFLAGS = -Wall

ifeq ($(PLATFORM), WEB)
    # Compile with emscripten - untested as yet
    CC = emcc
    AR = emar
endif

bingus.a: $(BINGUS_OBJS)
    $(AR) cr $@ $^
 
bingus.o: $(SOURCE_PATH)/bingus.cpp
    $(CC) $(CFLAGS) $< -c $(BINGUS_INCLUDES)
 
debug.o: $(SOURCE_PATH)/debug.cpp
    $(CC) $(CFLAGS) $< -c $(BINGUS_INCLUDES)
 
entity.o: $(SOURCE_PATH)/entity.cpp
    $(CC) $(CFLAGS) $< -c $(BINGUS_INCLUDES)
 
glad.o: $(SOURCE_PATH)/glad.c
    $(CC) $(CFLAGS) $< -c $(BINGUS_INCLUDES)
 
input.o: $(SOURCE_PATH)/input.cpp
    $(CC) $(CFLAGS) $< -c $(BINGUS_INCLUDES)
 
math.o: $(SOURCE_PATH)/math.cpp
    $(CC) $(CFLAGS) $< -c $(BINGUS_INCLUDES)
 
renderer.o: $(SOURCE_PATH)/renderer.cpp
    $(CC) $(CFLAGS) $< -c $(BINGUS_INCLUDES)
 
shader.o: $(SOURCE_PATH)/shader.cpp
    $(CC) $(CFLAGS) $< -c $(BINGUS_INCLUDES)
 
texture.o: $(SOURCE_PATH)/texture.cpp
    $(CC) $(CFLAGS) $< -c $(BINGUS_INCLUDES)
 
ui.o: $(SOURCE_PATH)/ui.cpp
    $(CC) $(CFLAGS) $< -c $(BINGUS_INCLUDES)
 
window.o: $(SOURCE_PATH)/window.cpp
    $(CC) $(CFLAGS) $< -c $(BINGUS_INCLUDES)
 
examples: hello_window
 
hello_window: $(EXAMPLES_PATH)/hello_window.cpp bingus.a
    $(CC) -o $@ $(CFLAGS) $(BINGUS_INCLUDES) $^ -L$(LIB_PATH) -lglfw3 -lgdi32 -lopengl32 -lfreetype

已检查g++命令中的参数顺序,看起来是正确的。所有要链接的库都是用Visual Studio单独编译的,位于项目的lib/文件夹下,名为libglfw3.a和libfreetype.a,glfw没有抛出链接错误,应该可以正常工作。


解决方法

1. 修复库的编译兼容性问题

你用Visual Studio编译的FreeType静态库(.a格式)和MinGW的g++不兼容——MSVC生成的是微软格式的静态库,而MinGW依赖GNU格式,两者无法直接混用。

  • 解决:用MinGW工具链重新编译FreeType,生成GNU格式的.a库。

2. 调整链接顺序

静态库的依赖关系要求被依赖的库放在依赖它的库之后。bingus.a依赖FreeType,所以-lfreetype必须放在bingus.a之后。修改Makefile中hello_window的链接命令:

hello_window: $(EXAMPLES_PATH)/hello_window.cpp bingus.a
    $(CC) -o $@ $(CFLAGS) $(BINGUS_INCLUDES) $(EXAMPLES_PATH)/hello_window.cpp -L$(LIB_PATH) bingus.a -lfreetype -lglfw3 -lgdi32 -lopengl32

原理:链接器从左到右处理文件,当bingus.a出现未定义的FreeType符号时,后续的-lfreetype可以提供对应的符号定义。

3. 验证库路径与文件名

  • 确认lib/文件夹下确实存在libfreetype.a,如果是MSVC格式的freetype.lib,需要重命名为libfreetype.a,或者直接指定库的绝对路径:
    hello_window: $(EXAMPLES_PATH)/hello_window.cpp bingus.a
        $(CC) -o $@ $(CFLAGS) $(BINGUS_INCLUDES) $^ $(LIB_PATH)/libfreetype.a -lglfw3 -lgdi32 -lopengl32
    

4. 检查编译阶段的头文件引用

确保编译renderer.cpp时,正确包含了FreeType的头文件路径,且renderer.cpp中没有写错函数名、遗漏必要头文件(比如#include <ft2build.h>)。


内容的提问来源于stack exchange,提问作者SonOfDadKiller

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 13:05:42