MXE 和 SDL2 出现多个 "Undefined reference" 错误

Multiple "Undefined reference" errors with MXE and SDL2

我正在尝试编译一个使用 SDL 进行上下文创建和图像加载的 OpenGL 程序。当我在 Linux 上本地编译它时,它编译并运行没有错误。我在 /opt/mxe 中安装了 MXE 并检查了 SDL2 目录(其中包含 headers)在 /opt/mxe/usr/i686-w64-mingw32.static/include/ 中,而相应的库(libSDL.a 等)在/opt/mxe/usr/i686-w64-mingw32.static/lib/

包含的 header 个文件是 <SDL2/SDL.h><SDL2/SDL_image.h>

我正在尝试使用

编译上述程序

i686-w64-mingw32.static-gcc 5_transformation.c -I/opt/mxe/usr/i686-w64-mingw32.static/include -L/opt/mxe/usr/i686-w64-mingw32.static/lib -lmingw32 -lSDL2main -lSDL2 -lSDL2_image -lGLEW -lopengl32 -lm -mwindows

但是,它给出了多个未定义的引用错误:[http://pastebin.com/JaadTNnv

]1

其中许多错误似乎与我没有使用的 Direct3D 等有关(但 SDL2 可能在内部使用)。我也必须 link 反对他们吗?我这样做对吗? (MXE页面好像没有详细说明)

PS。这个问题,或者它的变体,似乎在互联网上很流行。不过,我已经按照他们的指示去做了。我的主要功能定义为 int main(int argc, char *argv[]),我 link 反对 -lmingw32、-lSDL2main 和 -mwindows,我已确保 GCC 参数中的路径正确,我尝试将 i686-w64-mingw32.static-sdl-config --cflags --libsi686-w64-mingw32.static-pkg-config SDL_image --cflags --libs 在参数中而不是显式 linking(它只是为 SDL 函数提供了未定义的引用,如 SDL_GL_CreateContextIMG_Load 并表示 Package SDL_image was not found in the pkg-config search path.)。

你应该使用 pkg-config --cflags sdl2pkg-config --libs sdl2 来获取所有的 cflags 和 libs你需要。 (顺便说一句,不要包含 SDL2/SDL.h,而只包含 SDL.h 并使用 pkg -config --cflags values to set your include paths if you want to be more portable)

除了使用pkg-config,您还可以使用sdl2-config

如果这对您的设置也没有帮助 - 请查看随 mxe 提供的 sdl2 示例。将您的代码添加到其中,并尝试在您的 mxe 结帐中通过 运行 make sdl2 在 mxe 中(重新)编译 sdl2。 (https://github.com/mxe/mxe/commit/c3624cdefb7ff0c4b69316c7c1b740b97f55e1db)

我在 /opt/mxe/ 中安装了 MXE,以下对我有用(我试图编译的文件是 5_transformation.c):

/opt/mxe/usr/bin/i686-w64-mingw32.static-gcc 5_transformation.c -mwindows `/opt/mxe/usr/bin/i686-w64-mingw32.static-pkg-config --cflags sdl2` `/opt/mxe/usr/bin/i686-w64-mingw32.static-pkg-config --cflags SDL2_image` -lmingw32 -lGLEW -lopengl32 -lm `/opt/mxe/usr/bin/i686-w64-mingw32.static-pkg-config --libs sdl2` `/opt/mxe/usr/bin/i686-w64-mingw32.static-pkg-config --libs SDL2_image`

确保所有可执行文件的路径正确(gcc 以及 pkg-config),将 --cflags 参数放在 --libs 之前,确保您键入 sdl2(小写为 sdl)和 SDL2_image(大写为 SDL),使用 -mwindows-lmingw32 并使用 -lopengl32 而不是 -lgl