mingw-w64和SDL2链接的问题

5

我正在尝试遵循一个SDL教程并编译使用SDL的C++文件。我使用的是Windows 10,最初使用的是MinGW。

在某个时刻,我意识到我的MinGW安装存在与SDL无关的问题,因此我改用了MinGW-w64,这解决了非SDL问题,但现在当我尝试使用SDL编译任何内容时,它不能找到lSDL2或lSDL2main。然而,它确实会跳过各种文件,并指出它们不兼容。

我怀疑这可能是32位/64位不兼容引起的问题,但我不确定为什么会发生这种情况,即使我明确确保使用32位g++编译器,问题仍然存在。供参考,我输入的命令是

 x86_64-w64-mingw32-g++  04_key_presses.cpp                 
-IC:\mingw_dev_lib\include\SDL2 -LC:\mingw_dev_lib\lib -w                    
-Wl,subsystem,windows -lmingw32 -lSDL2main -lSDL2 -o key_presses
错误信息如下:
C:/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/7.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:\mingw_dev_lib\lib/libSDL2main.a when searching for -lSDL2main
C:/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/7.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:\mingw_dev_lib\lib\libSDL2main.a when searching for -lSDL2main
C:/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/7.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:\mingw_dev_lib\lib/libSDL2main.a when searching for -lSDL2main
C:/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/7.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lSDL2main
C:/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/7.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:\mingw_dev_lib\lib/libSDL2.dll.a when searching for -lSDL2
C:/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/7.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:\mingw_dev_lib\lib/libSDL2.a when searching for -lSDL2
C:/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/7.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:\mingw_dev_lib\lib\libSDL2.a when searching for -lSDL2
C:/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/7.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:\mingw_dev_lib\lib/libSDL2.dll.a when searching for -lSDL2
C:/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/7.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:\mingw_dev_lib\lib/libSDL2.a when searching for -lSDL2
C:/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/7.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lSDL2
collect2.exe: error: ld returned 1 exit status 

1
编译Windows程序如果不使用Visual Studio会很麻烦。我强烈建议使用CMake为所有平台生成构建系统,然后在Windows上使用VS。 - xaxxon
1个回答

4
您的编译器是x86_64-w64-mingw32-g++,这是64位编译器。32位编译器是i686-w64-mingw32-g++.exe。您正在尝试使用64位链接:
x86_64-w64-mingw32-g++  04_key_presses.cpp \                
-IC:\mingw_dev_lib\include\SDL2 -LC:\mingw_dev_lib\lib -w \                   
-Wl,subsystem,windows -lmingw32 -lSDL2main -lSDL2 -o key_presses

跳过不兼容的32位SDL2库。

64位编译器可以构建64位或32位目标,其中默认情况下构建64位。要针对32位目标,请在编译和链接时传递-m32。由于您使用一个命令同时完成了这两个操作,因此只需传递一次即可:

x86_64-w64-mingw32-g++  04_key_presses.cpp -m32 \                
-IC:\mingw_dev_lib\include\SDL2 -LC:\mingw_dev_lib\lib -w \                   
-Wl,subsystem,windows -lmingw32 -lSDL2main -lSDL2 -o key_presses

1
如果我添加了-m32,那么我会得到更多的错误消息,说它正在跳过不兼容的东西并且找不到它们,但它们不再是SDL的东西了。 https://pastebin.com/FYzNHsPj - Jon G
1
@JonG 对的,在这种情况下,您正在尝试链接一组32位和64位库,这是行不通的。我猜您现在缺少的是工具链的32位库。在64位系统上,除非您有特定的需要针对32位目标,否则建议获取并使用64位SDL2库。 - Mike Kinghan
1
@JonG 我刚刚检查了你的链接。是的,你没有工具链的32位库。它们默认情况下在链接中。 - Mike Kinghan
“they are in the linkage by default” 是什么意思? - Jon G
1
好的,我刚刚把所有东西都切换到了64位,看起来可以工作了,谢谢! - Jon G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接