c++ 使用g++编译依赖FreeType库的程序时引用未定义

uinbv5nw  于 2022-12-24  发布在  其他
关注(0)|答案(1)|浏览(251)

我目前正在为我的gamedev项目编写makefile文件,并设法将所有内容编译到一个静态库bingus.a-我的引擎中。我现在正在尝试构建一个示例程序,但我发现我的FreeType静态库链接不正确。
下面是make命令的输出

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.alibfreetype.a- glfw不会引发链接错误,因此可能工作正常。

pkln4tw6

pkln4tw61#

正如评论所建议的,问题是我试图包含用不同编译器编译的库,通过使用MinGW编译所有依赖项,我能够修复这个问题。

相关问题