我正在制作一个C++游戏,并通过MSYS 2环境在Windows MinGW GCC上集成Steam的API。我成功地链接到库,一些功能运行正常。
我可以初始化steamworks并运行SteamFriends()->GetPersonaName(),它会像预期的那样返回我自己的steam用户。
但是,当我运行SteamUser()->GetSteamID()时,它会给我一个segfault。在调试时,我发现SteamUser()返回一个地址(它不是NULL),但该地址并没有寻址一个有效的ISeamUser类/结构。我开始相信,也许windows为steam_API加载的DLL不是我链接的那个。
有没有办法确定这一点?还有,有没有人有任何其他的调试方法,他们将使用,以试图确定问题?
我还使用visual studio编译了一个相同的应用程序,它没有遇到segfault,所以我已经将问题隔离到我的代码外部,可能与DLL的链接方式有关。
1条答案
按热度按时间ycl3bljg1#
SteamUser()->GetSteamID()
崩溃是由于MINGW(您的应用程序使用)和MSVC(Steam DLL使用)之间的C++ ABI差异。基本上,GetSteamID()
不仅返回整数值,还返回CSteamID
类,并且传递类值的二进制约定在不同的编译器中是不同的。相关的SteamWorks讨论(仅限已批准的Steam开发者访问):
要修复此调用(以及可能存在相同问题的其他SteamAPI调用),您可以使用
<steam/steam_api_flat.h>
的C API,它不会受到ABI差异的影响:混合使用C和C++ API是可以的,所以你仍然可以在大部分时间使用C++ API,只在有问题的调用中使用C API。
也可以切换到MSVC或MSVC-clang。