[特殊字符] GUNION SDK 接口调用方式说明(静态库 vs 动态库)

文章目录

  • [💡 GUNION SDK 接口调用方式说明(静态库 vs 动态库)](#💡 GUNION SDK 接口调用方式说明(静态库 vs 动态库))
    • [📘 一、接口宏定义说明](#📘 一、接口宏定义说明)
    • [🚀 二、使用方式对比](#🚀 二、使用方式对比)
    • [🧱 三、调用方使用方式详解](#🧱 三、调用方使用方式详解)
      • [✅ 1. 使用静态库(.lib)](#✅ 1. 使用静态库(.lib))
      • [✅ 2. 使用 DLL(隐式链接)](#✅ 2. 使用 DLL(隐式链接))
      • [✅ 3. 使用 DLL(动态加载 LoadLibrary)](#✅ 3. 使用 DLL(动态加载 LoadLibrary))
    • [🔍 四、导出名注意事项(运行时加载)](#🔍 四、导出名注意事项(运行时加载))
    • [📦 五、推荐发布内容(给调用者)](#📦 五、推荐发布内容(给调用者))
    • [✅ 六、宏设置汇总](#✅ 六、宏设置汇总)

💡 GUNION SDK 接口调用方式说明(静态库 vs 动态库)

本手册详细介绍 Ghome.h 接口文件在不同调用场景下的使用方式,包括宏控制、链接方式、运行时行为、适配代码等,确保调用方能够正确配置并调用 SDK 接口。


📘 一、接口宏定义说明

Ghome.h 中,使用如下宏控制导出/导入行为:

cpp 复制代码
#if defined(GHOME_STATIC)
    #define GHOME_API
#elif defined(GHOME_EXPORTS)
    #define GHOME_API __declspec(dllexport)
#else
    #define GHOME_API __declspec(dllimport)
#endif

含义如下:

宏定义 含义说明
GHOME_STATIC 表示使用静态库(.lib),不需要 DLL
GHOME_EXPORTS 表示正在编译 DLL,导出符号(供别人用)
未定义任何宏 默认行为,表示正在使用 DLL(导入符号)

🚀 二、使用方式对比

使用场景 是否需要定义宏 是否使用 .lib 是否需要 .dll 是否使用 LoadLibrary
✅ 静态库 .lib 编译链接 #define GHOME_STATIC ✅ 是 ❌ 否 ❌ 否
✅ DLL(隐式链接) 无需定义宏 ✅ 是 ✅ 是 ❌ 否
✅ DLL(运行时动态加载) ❌ 不需要宏 ❌ 否 ✅ 是 ✅ 是

🧱 三、调用方使用方式详解

✅ 1. 使用静态库(.lib)

  • 头文件中添加宏:
cpp 复制代码
#define GHOME_STATIC
#include "Ghome.h"
  • 链接设置:
    • 链接 .lib 文件(例如:ghome_static.lib
    • 不需要运行时存在 .dll
  • 示例代码:
cpp 复制代码
GhomeLAppInfo appInfo = { sizeof(GhomeLAppInfo), 123, L"游戏名", L"1.0", -1, -1 };
int ret = GhomeInitialize(&appInfo);

✅ 2. 使用 DLL(隐式链接)

  • 不需要定义任何宏
  • 工程中链接 .lib 文件(由 DLL 编译生成);
  • 运行时需要 .dll 文件放在可执行文件旁边或系统 PATH 中。
  • 示例代码:
cpp 复制代码
#include "Ghome.h"

GhomeLAppInfo appInfo = { sizeof(GhomeLAppInfo), 123, L"游戏名", L"1.0", -1, -1 };
int ret = GhomeInitialize(&appInfo);

✅ 3. 使用 DLL(动态加载 LoadLibrary)

  • 不需要包含 ghome.h(除非重用 struct 定义)
  • 使用 typedef 声明函数指针
  • 使用 LoadLibraryGetProcAddress 动态调用
  • 示例代码:
cpp 复制代码
typedef int (__cdecl *PF_GhomeInitialize)(const GhomeLAppInfo*);
HMODULE hDll = LoadLibraryW(L"`sdologinsdk.dll`");
if (hDll) {
    PF_GhomeInitialize init = (PF_GhomeInitialize)GetProcAddress(hDll, "GhomeInitialize");
    if (init) {
        GhomeLAppInfo appInfo = { sizeof(GhomeLAppInfo), 123, L"游戏名", L"1.0", -1, -1 };
        int ret = init(&appInfo);
    }
    FreeLibrary(hDll);
}
  • 优点: 不需链接 .lib,运行时灵活控制加载;
  • 缺点: 函数名大小写必须匹配,需手动定义所有函数指针;

🔍 四、导出名注意事项(运行时加载)

使用 GetProcAddress 加载函数时,需要确认 DLL 中函数是否为标准 C 导出名(例如 GhomeInitialize)而不是带修饰符的(如 _GhomeInitialize@4)。建议:

  • 在 C++ 中使用 extern "C" 包裹导出声明;
  • 使用 dumpbin /exports ghome.dll 验证导出名;
  • 保证函数名在头文件与 DLL 中完全一致。

📦 五、推荐发布内容(给调用者)

建议发布以下内容给调用者:

文件名 描述
ghome.h 公共头文件
sdologinsdk.lib、sdologinsdk64.lib 静态库文件(如使用静态库)
sdologinsdk.dll、sdologinsdk64.dll 动态库运行时文件
sdologinsdk.lib、sdologinsdk64.lib DLL 的 import 库(隐式链接时用)

✅ 六、宏设置汇总

使用方式 推荐设置
静态链接 #define GHOME_STATIC
DLL 编译 #define GHOME_EXPORTS
DLL 调用 不定义宏(默认导入)
动态加载 DLL 不定义宏,自定义函数指针
相关推荐
John_ToDebug4 小时前
浏览器扩展延迟加载优化实战:如何让浏览器启动速度提升50%
c++·chrome·windows
是娇娇公主~4 小时前
C++ 中 std::deque 的原理?它内部是如何实现的?
开发语言·c++·stl
SuperEugene4 小时前
Axios 接口请求规范实战:请求参数 / 响应处理 / 异常兜底,避坑中后台 API 调用混乱|API 与异步请求规范篇
开发语言·前端·javascript·vue.js·前端框架·axios
蟑螂恶霸5 小时前
Windows安装OpenCV 4.8
人工智能·windows·opencv
xuxie995 小时前
N11 ARM-irq
java·开发语言
wefly20176 小时前
从使用到原理,深度解析m3u8live.cn—— 基于 HLS.js 的 M3U8 在线播放器实现
java·开发语言·前端·javascript·ecmascript·php·m3u8
luanma1509806 小时前
PHP vs C++:编程语言终极对决
开发语言·c++·php
寂静or沉默6 小时前
2026最新Java岗位从P5-P7的成长面试进阶资源分享!
java·开发语言·面试
csdn_aspnet7 小时前
C/C++ 两个凸多边形之间的切线(Tangents between two Convex Polygons)
c语言·c++·算法
特立独行的猫a7 小时前
在 Windows 10 上安装和使用 WSL 2 安装 Ubuntu24详细指南
windows·ubuntu·wsl2