You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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", &params, &result);
    }

    // 程序退出前释放DLL
    FreeLibrary(discordDll);
    return 0;
}

这种方式完全不受DLL文件名限制,还能灵活处理加载失败的情况。

内容的提问来源于stack exchange,提问作者Pavel12398

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 03:22:22