MinGW静态链接SFML库时遇到的问题

4

我有一个在Linux下编译没有错误的程序,但是当我使用MinGW将其编译为Windows版本时,它无法运行,因为它需要一些DLL文件。所以我决定静态链接它,但是却输出了一些错误:

/usr/i586-mingw32msvc/lib/libsfml-window-s.a(WindowImplWin32.o):WindowImplWin32.cpp:(.text+0x146e): undefined reference to `__Unwind_Resume'
/usr/i586-mingw32msvc/lib/libsfml-window-s.a(WindowImplWin32.o):WindowImplWin32.cpp:(.text+0x17d0): more undefined references to `__Unwind_Resume' follow
/usr/i586-mingw32msvc/lib/libsfml-window-s.a(WindowImplWin32.o):WindowImplWin32.cpp:(.eh_frame+0x12): undefined reference to `___gxx_personality_v0'
/usr/i586-mingw32msvc/lib/libsfml-window-s.a(Joystick.o):Joystick.cpp:(.eh_frame+0x11): undefined reference to `___gxx_personality_v0'
collect2: ld returned 1 exit status

看起来它似乎有一些外部依赖项。这些是什么,我该如何链接它们?

编辑:

这是我在命令行中输入的内容:

i586-mingw32msvc-g++ "./main.cpp" -o "./win32.exe" /usr/i586-mingw32msvc/lib/libsfml-graphics-s.a /usr/i586-mingw32msvc/lib/libsfml-window-s.a /usr/i586-mingw32msvc/lib/libm.a /usr/i586-mingw32msvc/lib/libmsvcr90.a

需要帮助。


你能发一下你的编译命令吗?这些错误看起来像是你在使用gcc而不是g++来编译/链接C++代码时出现的情况。 - Mat
2个回答

1

我最近也遇到了这个问题。

问题在于SFML使用DW2异常处理编译,但默认的MinGW交叉编译器(在Debian和Ubuntu仓库中)使用SJLJ,两者不兼容。我不得不使用DW2异常处理构建自己的交叉编译器,这样可以完美地工作。或者,您可以使用现有的SJLJ编译器构建SFML本身,这样SFML也将是SJLJ。

我决定构建DW2编译器,因为它是更现代的方法,而且这也是一个很好的练习。


嗯...我可以发送给你我自己构建的DW2交叉编译器,但我不能保证它也能在你的机器上运行...而且我计划在我的博客中写一些关于构建过程的内容,但那是用匈牙利语写的。 - Attila
哦,如果你不打算从Linux编译Windows(因此你不会进行交叉编译),那么你只需要下载一个MinGW包,它使用DW2,所以无需编译器构建。在我看来,TDM版的MinGW已经打包了两个版本,但“标准”MinGW是DW2。但是需要注意。例如,CodeBlocks包括带有SJLJ的TDM版,这就是为什么它在启动时无法正常工作的原因。对不起,我以为你想进行交叉编译。 - Attila
我确实想进行交叉编译,但我认为我会尝试在Windows上编译它,因为这可能比构建交叉编译器更容易。非常感谢。 - slartibartfast

0

确保你使用g++而不是gcc,这应该可以解决问题。从头开始(清除所有内容再重新构建)。另一个选项可能是此处所描述的,假设你已经在使用g++但仍然遇到了问题。


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