c++ 从使用MinGW GCC编译的可执行文件调用的一些steam_api. dll时出现Segfault,有什么方法可以确定加载的是哪个DLL?

eit6fx6z  于 2023-07-01  发布在  其他
关注(0)|答案(1)|浏览(135)

我正在制作一个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的链接方式有关。

ycl3bljg

ycl3bljg1#

SteamUser()->GetSteamID()崩溃是由于MINGW(您的应用程序使用)和MSVC(Steam DLL使用)之间的C++ ABI差异。基本上,GetSteamID()不仅返回整数值,还返回CSteamID类,并且传递类值的二进制约定在不同的编译器中是不同的。
相关的SteamWorks讨论(仅限已批准的Steam开发者访问):

要修复此调用(以及可能存在相同问题的其他SteamAPI调用),您可以使用<steam/steam_api_flat.h>的C API,它不会受到ABI差异的影响:

SteamAPI_ISteamUser_GetSteamID(SteamUser())

混合使用C和C++ API是可以的,所以你仍然可以在大部分时间使用C++ API,只在有问题的调用中使用C API。
也可以切换到MSVC或MSVC-clang。

相关问题