如何让Discord Game SDK的DLL同时适配x86与x64架构?
问题描述
我为C++游戏接入了Discord Game SDK库,已实现x64和Win32架构的编译,编译配置代码如下:
#ifdef _WIN64 #pragma comment(lib, "lib/x86_64/discord_game_sdk.dll.lib") #elif defined(_WIN32) #pragma comment(lib, "lib/x86/discord_game_sdk.dll.lib") #endif
游戏目录下存在game_x86.exe和game_x64.exe两个可执行文件,x64版本可正常使用lib/x86_64下的discord_game_sdk.dll,但x86版本因DLL重名无法直接添加,重命名为discord_game_sdk_x86.dll也无效。我尝试寻找Discord Game SDK源码重新编译以添加_x86和_x64前缀,但未找到相关资源,查阅官方文档也未得到解决方案,恳请告知如何让该DLL适配两种架构。
解决方案
1. 目录分离存放(最简单)
给两个架构的可执行文件分别创建独立子目录,各自存放对应架构的DLL:
- 在游戏根目录新建
x86和x64文件夹 - 将
game_x86.exe和lib/x86/discord_game_sdk.dll移动到x86目录 - 将
game_x64.exe和lib/x86_64/discord_game_sdk.dll移动到x64目录 - 根目录创建快捷方式指向两个子目录里的exe,方便用户启动
2. 配置文件指定DLL搜索路径
通过创建exe对应的配置文件,让程序从指定子目录加载DLL:
步骤1:整理DLL路径
保留lib/x86和lib/x86_64目录,分别放入对应架构的discord_game_sdk.dll
步骤2:创建配置文件
在根目录创建game_x86.exe.config,内容如下:
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <probing privatePath="lib/x86"/> </assemblyBinding> </runtime> </configuration>
创建game_x64.exe.config,内容如下:
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <probing privatePath="lib/x86_64"/> </assemblyBinding> </runtime> </configuration>
这样程序启动时会自动从配置指定的路径搜索DLL,无需修改编译代码。
3. 动态加载DLL (推荐)
放弃静态导入.lib文件,改用LoadLibrary动态加载指定路径的DLL,彻底规避重名问题:
修改后的核心代码
#include <windows.h> #include "discord_game_sdk.h" // 根据Discord SDK的函数定义,声明对应的函数指针类型 typedef void(*Discord_InitializeFn)(const char* applicationId, const struct DiscordCreateParams* params, enum DiscordResult* result); int main() { HMODULE discordDll = nullptr; #ifdef _WIN64 // 加载x64版本DLL discordDll = LoadLibrary(L"lib/x86_64/discord_game_sdk.dll"); #elif defined(_WIN32) // 加载x86版本DLL discordDll = LoadLibrary(L"lib/x86/discord_game_sdk.dll"); #endif if (!discordDll) { // 处理DLL加载失败逻辑 return 1; } // 获取SDK初始化函数地址 Discord_InitializeFn Discord_Initialize = (Discord_InitializeFn)GetProcAddress(discordDll, "Discord_Initialize"); if (Discord_Initialize) { // 调用初始化函数,示例参数需根据实际情况调整 DiscordCreateParams params{}; DiscordResult result; Discord_Initialize("你的应用ID", ¶ms, &result); } // 程序退出前释放DLL FreeLibrary(discordDll); return 0; }
这种方式完全不受DLL文件名限制,还能灵活处理加载失败的情况。
内容的提问来源于stack exchange,提问作者Pavel12398
相关产品推荐
相关产品推荐

