Ubuntu下MinGW交叉编译引入SDL_image找不到头文件问题
问题修复方案
核心错误定位
你当前命令里存在低级路径拼写错误:SDL2_image的头文件目录参数把include错写为inclulde(多输入了一个字母l),编译器无法识别这个不存在的路径,自然找不到对应头文件。
除此之外你的编译命令还有3处会导致后续编译/运行失败的隐患:
- 编译C源文件(.cpp)使用了C语言编译器前端
i686-w64-mingw32-gcc,会触发C符号链接错误 - 编译参数顺序错误:MinGW工具链按参数顺序扫描依赖,源文件必须放在库链接参数之前,库的链接顺序需要满足「被依赖项放在后面」的规则
- 未提前校验头文件目录层级是否和include语句匹配
修正后可直接运行的编译命令
i686-w64-mingw32-g++ main.cpp -o main32.exe \ -I /home/nick/SDL/SDL2-devel-2.0.22-mingw/SDL2-2.0.22/i686-w64-mingw32/include \ -I /home/nick/SDL/SDL2_image-devel-2.6.0-mingw/SDL2_image-2.6.0/i686-w64-mingw32/include \ -L /home/nick/SDL/SDL2-devel-2.0.22-mingw/SDL2-2.0.22/i686-w64-mingw32/lib \ -L /home/nick/SDL/SDL2_image-devel-2.6.0-mingw/SDL2_image-2.6.0/i686-w64-mingw32/lib \ -lmingw32 -lSDL2main -lSDL2 -lSDL2_image
校验与运行注意事项
- 执行命令前可手动校验头文件路径是否存在,执行下列命令如果返回对应文件路径则说明目录配置正确:
ls /home/nick/SDL/SDL2_image-devel-2.6.0-mingw/SDL2_image-2.6.0/i686-w64-mingw32/include/SDL2/SDL_image.h
- 头文件目录层级必须匹配你的include写法:你代码中写的是
#include <SDL2/SDL_image.h>,因此-I指定的路径必须是包含SDL2文件夹的上一级include目录,不要直接写到SDL2子文件夹层级。 - 编译完成后需要将两个开发包i686-w64-mingw32目录下bin文件夹内的
SDL2.dll、SDL2_image.dll以及SDL2_image依赖的zlib、libpng、libjpeg等配套dll,全部复制到main32.exe同级目录,否则运行时会报找不到动态库错误。 - 库链接顺序不可随意调整:
-lmingw32必须放在所有SDL库之前,-lSDL2main必须在-lSDL2之前,-lSDL2_image作为上层扩展必须放在-lSDL2之后。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

