使用i686-w64-mingw32版本SDL2编译代码时Makefile链接失败如何解决
错误原因
- 链接参数顺序错误:GCC 链接器对参数传入顺序高度敏感,所有
-l开头的链接库参数必须放在源文件/编译生成的目标文件之后。你当前的 Makefile 中将链接库参数放在了源文件参数之前,链接器扫描到 SDL 相关库时,还未处理源文件中对SDL_Init、SDL_GetError等函数的引用请求,因此不会主动加载库中的对应符号,最终触发未定义引用报错。 - 架构不匹配风险:你使用的是 i686(32位)版本的 SDL2 库,若当前安装的 g++ 默认编译生成64位程序,也会出现符号无法匹配的链接错误,该问题为次要排查点。
修复方案
第一步:调整 Makefile 参数顺序
将编译命令中的链接库参数移到所有参数的最后,修改后的 Makefile 对应部分如下:
SRC_DIR = src BUILD_DIR = build/debug CC = g++ SRC_FILES = ${wildcard ${SRC_DIR}/*.cpp} OBJ_NAME = game INCLUDE_PATHS = -Iinclude LIBRARY_PATHS = -Llib COMPILER_FLAGS = -std=c++17 -Wall LINKER_FLAGS = -lmingw32 -lSDL2main -lSDL2 all: $(CC) $(COMPILER_FLAGS) $(INCLUDE_PATHS) $(LIBRARY_PATHS) $(SRC_FILES) -o $(BUILD_DIR)/$(OBJ_NAME) $(LINKER_FLAGS)
第二步(可选,仅第一步修复失败时执行):匹配编译架构
如果调整顺序后仍有报错,说明库和编译生成的程序架构不匹配,在编译和链接参数中加上 -m32 指定生成32位程序即可:
COMPILER_FLAGS = -std=c++17 -Wall -m32 LINKER_FLAGS = -m32 -lmingw32 -lSDL2main -lSDL2
修改完成后重新执行 make 即可正常生成可执行文件。
内容的提问来源于stack exchange,提问作者Bunea Alexandru
相关产品推荐
相关产品推荐

