我正在制作一个C++游戏,并通过MSYS2环境在Windows MinGW GCC上集成Steam的API。我已成功链接到该库,并且某些功能运行正常。
我能够初始化 steamworks 并运行 SteamFriends()->GetPersonaName(),并且它按预期返回我自己的 Steam 用户。
但是,当我运行 SteamUser()->GetSteamID() 时,它给了我一个段错误。经过调试,我发现 SteamUser() 返回一个地址(它不是 NULL),但该地址没有寻址有效的 ISteamUser 类/结构。我开始相信,也许 Windows 为 steam_api 加载的 DLL 不是我链接的那个。
有什么办法可以确定吗?还有人有任何其他调试方法可以用来尝试识别问题吗?
我还使用 Visual Studio 编译了一个相同的应用程序,它没有遇到段错误,因此我已将问题隔离到我的代码外部,可能与 DLL 的链接方式有关。
最佳答案
SteamUser()->GetSteamID()
崩溃是由于 MINGW(由您的应用程序使用)和 MSVC(由 Steam DLL 使用)之间的 C++ ABI 差异造成的。基本上GetSteamID()
不仅返回整数值,还返回 CSteamID
类,并且传递类值的二进制约定在不同的编译器中是不同的。
相关 SteamWorks 讨论(仅适用于经过批准的 Steam 开发者):
- https://steamcommunity.com/groups/steamworks/discussions/0/358416640405914974/
- https://steamcommunity.com/groups/steamworks/discussions/0/282992646967220526/
要修复此调用(以及可能存在相同问题的其他 SteamAPI 调用),您可以使用 <steam/steam_api_flat.h>
中的 C API ,它不受 ABI 差异的影响:
SteamAPI_ISteamUser_GetSteamID(SteamUser())
混合使用 C 和 C++ API 是可以的,因此大多数时候您仍然可以使用 C++ API,只有在有问题的调用时才使用 C API。
或者您可以切换到 MSVC 或 MSVC-clang。
关于c++ - 使用 MinGW GCC 编译的可执行文件中的某些 steam_api.dll 调用出现段错误。有什么方法可以确定加载了哪个 DLL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71711846/