CommonLibSSE NG
CommonLibSSE NG 是 CharmedBaryon 的 CommonLibSSE-NG 的分支,而 CommonLibSSE-NG 本身又是 CommonLibSSE 的分支,它跟踪上游更新,但增加了一些增强功能。 它支持 Skyrim Special Edition (SE)、Skyrim Anniversary Edition (AE) 和 Skyrim Virtual Reality (VR)。
用法
要开发一个使用 CommonLibSSE 的 C++ 项目,你需要让此代码可供发现,并由你的构建管理器作为构建依赖项包含。以下是使用 xmake 或 cmake 管理器的示例。
[!TIP] 示例和模板请参见 wiki:https://github.com/alandtse/CommonLibSSE-NG/wiki/Projects-using-CommonLib
获取代码:Git 子模块
假设你有一个包含模组素材的文件夹,可以将其转换为 git 仓库,以便将此仓库作为子模块添加, 让 git 管理更新、路径、名称、版本…… 为此:
使用文件夹 初始化一个 git 仓库:
PS E:\Git\foo-bar> git init
Initialized empty Git repository in E:/Git/foo-bar/.git/
将此 CommonLibSSE 仓库添加为 git submodule,指定 ng 分支,
并将其存储在 lib/commonlibsse-ng 文件夹中:
PS E:\Git\foo-bar> git submodule add -b ng https://github.com/alandtse/CommonLibSSE-NG.git lib/commonlibsse-ng
Cloning into 'E:/Git/foo-bar/lib/commonlibsse-ng'...
remote: Enumerating objects: 66210, done.
remote: Counting objects: 100% (2526/2526), done.
remote: Compressing objects: 100% (197/197), done.
remote: Total 66210 (delta 2397), reused 2335 (delta 2329), pack-reused 63684 (from 1)
Receiving objects: 100% (66210/66210), 18.99 MiB | 19.58 MiB/s, done.
Resolving deltas: 100% (51252/51252), done.
PS E:\Git\foo-bar
[!TIP] 如果你的子模块最终位于其他代码无法找到的位置,你可以移除并重新添加子模块,参见 https://stackoverflow.com/a/1260982
此时,git 正在跟踪你机器上代码的更改。你可以添加一个基于云端的远程仓库用于备份、分发或协作;相关说明请参见 GitHub 或 CodeBerg。
要更新你项目的子模块,你可以使用:
PS E:\Git\foo-bar> git submodule update --init --recursive
构建依赖:Xmake
如果使用 Xmake 构建系统,你可以通过在 DLL 目标配方中添加以下内容,来添加一个构建依赖项和一个适用于 SKSE 插件的自定义规则:
target("my_plugin")
set_kind("shared") --specifies this is a DLL
add_deps("commonlibsse-ng") --adds the dependency
add_rules("commonlibsse-ng.plugin", { --adds a custom build rule, whose details are in CommonLibSSE
name = "my_plugin",
author = "Dovahkiin",
description = "SKSE64 plugin using CommonLibSSE-NG"
})
构建依赖:CMake
如果使用 CMake 构建系统,你可以在 CMakeLists.txt 中添加以下内容以成功编译和链接:
find_package(CommonLibSSE REQUIRED)
target_link_libraries(${PROJECT_NAME} PUBLIC CommonLibSSE::CommonLibSSE)
新功能
多个运行时目标
CommonLibSSE NG 支持 Skyrim SE、AE 和 VR,并能够为这些运行时的任意组合创建构建,包括全部三种。这使得使用单个 DLL 创建可在任何 Skyrim 运行时中工作的 SKSE 插件成为可能,从而提高了开发者的生产力(只需一次构建和一个 CMake 预设)并改善了最终用户体验(无需在多个下载选项中进行选择,或从 FOMOD 中选择正确的 DLL)。对于 Skyrim AE,单个 DLL 同时支持 1.6.629 之前的版本和之后的版本(两种结构布局均受支持)。
针对多个 ABI 不兼容运行时的构建提供了必要的(但最少的)抽象,以便无论使用哪个 Skyrim 版本都能透明地工作。所有运行时的所有功能和类始终可用于潜在使用,并具备探测可用功能所需的必要支持。这允许单个插件动态地改变其行为,以利用特定 Skyrim 版本的特定功能(例如 VR 功能),当该运行时存在时。
简化的插件声明
历史上,插件需要定义 SKSEPlugin_Version 或 SKSEPlugin_Query 才能被检测为 SKSE 插件。为了
简化代码并确保为正确的跨运行时兼容性生成这两个函数,这在
CommonLibSSE NG 中已实现无代码化。只需在 CMakeLists.txt 中将 add_library 替换为 add_commonlibsse_plugin,CMake 就会创建
你的共享库目标,配置 CommonLibSSE 链接,并自动生成此内容并将其注入到
插件中。
find_package(CommonLibSSE REQUIRED)
add_commonlibsse_plugin(${PROJECT_NAME}
SOURCES ${headers} ${sources})
Clang 支持
当为 MSVC ABI 兼容性构建时(为 Windows 原生构建的版本),支持 Clang 13.x 及更高版本。在适当的配置下,甚至理论上可以从 Linux 主机使用 Clang 进行交叉编译(此功能的测试和说明尚待提供)。请注意,目前链接仍必须使用 Microsoft 链接器,因为 SKSE 本身的修复工作尚在进行中。
单元测试增强
对访问 Skyrim 可执行模块的方式进行了改进,以便进行内存重定位和处理地址库 ID。这使得在 Skyrim 进程上下文之外运行基于 CommonLibSSE 的插件代码变得更加容易,从而可以进行单元测试。甚至可以通过在测试期间以编程方式加载 Skyrim 可执行模块来处理引擎的最小级别功能,例如,允许在单个测试套件中运行在 SE、AE 和 VR 可执行文件之间变化的测试。
通过 Vcpkg 和 Conan 获取的旧版本
[!WARNING] 这些不属于此仓库,目前也未得到维护。
CommonLibSSE 的旧版本,特别是 CharmedByron 的版本,(曾经)可作为 vcpkg 端口 和 Conan 包 获取。这些不作为此项目的一部分进行维护。
Ninja 构建
CommonLibSSE NG 将构建系统迁移到 Ninja,从而实现了比 NMake 更快的并行构建。
其他更改
- 能够为仅存在于部分运行时中的对象定义偏移量和地址 ID,同时在使用这些偏移量之前能够动态测试功能支持。
- 完全重新生成的 RTTI 和 vtable 偏移量,现在在所有运行时中具有一致的命名和访问方式。
- 更新了 GitHub Actions CI 工作流,以构建所有可能的目标运行时组合。
- 完全可扩展的原生函数绑定特性(支持在 Fully Dynamic Game Engine) 中自定义脚本对象绑定。
- 对 CLion IDE 的更好支持。
构建依赖
依赖项通过 vcpkg 进行管理。完整列表请参阅 vcpkg.json。
Core Dependencies:
- fmt 12.1+
- rapidcsv 8.9+
- spdlog 1.16+
- xbyak 7.28+
- catch2 3.1.0+ (for testing)
- directxmath 2025-04-03 - DirectX Math library
- directxtk 2025-10-27 - DirectX Toolkit
Build Tools:
- Visual Studio 2022 - Desktop development with C++
- CMake 3.19+
- Vcpkg
最终用户依赖
开发
备注
- CommonLib 与 SKSE 不兼容,旨在作为静态依赖项取代它。然而,您仍然需要运行时组件。
许可证
GPL-3.0-or-later 附带 Modding Exception AND GPL-3.0 Linking Exception (with Corresponding Source)。 具体而言,Modded Code 包括:
- Skyrim(及其变体)
- 用于启用通过专有 SDK 提供的额外功能的硬件驱动程序,例如 Nvidia DLSS/Streamline 和 AMD FidelityFX FSR3
Modding Libraries 包括:
- SKSE
- Windows
[!IMPORTANT] 这是相对于之前 MIT 许可证的重大变更。Modding Exception 仅涵盖与 Skyrim 本身以及专有硬件 SDK(如 DLSS/Streamline 或 FSR3)的互操作性,这些 SDK 既非我们 也非插件作者有权重新授权——它不涵盖插件/模组代码。静态链接 CommonLibSSE NG 的插件 与其构成结合作品,且必须本身以 GPL-3.0-or-later(或兼容 GPL 的 许可证)进行授权;请参阅 EXCEPTIONS.md 了解确切条款。
最初基于 MIT 下的代码。