iT邦幫忙

2026 iThome 鐵人賽

DAY 27
0

前面在 CMake 那篇有提到動態資料庫,本來 MyDXEngineSDK 底下跟引擎有關的程式都是用 STATIC 來連結需要的程式到各個範例裡。

以 add_library(MyDXEngineSDK STATIC ...) 來做的話,目前他 build 完後,他會產生MyDXEngineSDK.lib 而裡面包含像是這樣的資料

GraphicsEngine
Renderer
Shader
Mesh
Vector3
...

而假設我前面的其中一個範例,他動用到了 GraphicsEngine

Renderer 、Shader 等等,那 build 完後 .exe 會包含下面的內容

XXX.exe
├─ main()
├─ GraphicsEngine()
├─ Renderer()
├─ Shader()
└─ ...

也就是其實屬於 Engine 的部分程式會被包進範例的 .exe 裡面,這樣會有問題,像是 .exe 的大小會變大、程式更新會牽動到範例 .exe、還有邊界不清楚等等問題。

這邊為了未來的整理規劃,想先改成以 DLL 的方式來獲取相關程式。

實作

在 MyDXEngineSDK/CMakeLists.txt,將原本的 add_library(MyDXEngineSDK STATIC ...) 改成下面這樣

add_library(MyDXEngineSDK SHARED
    core/graphics_engine.cpp
    # 其餘原有的來源檔照舊
    core/skyline_api.h
)

target_compile_definitions(MyDXEngineSDK PRIVATE MYDXENGINESDK_BUILD)

再來,需要有程式可以設定目前是要編譯 DLL 還是使用 DLL,所以創獨立的 skyline_api.h 來控制。

//skyline_api.h
#pragma once

#if defined(_WIN32) && !defined(MYDXENGINESDK_STATIC)
#if defined(MYDXENGINESDK_BUILD)
#define SKYLINE_API __declspec(dllexport) //Windows + 正在編譯 DLL
#else
#define SKYLINE_API __declspec(dllimport) //Windows + 使用 DLL
#endif
#else
#define SKYLINE_API
#endif

當然如果今天還是新增別的作業系統的話就要繼續往下加,像是如果要支援 Linux,就要這樣設定

#if defined(_WIN32)
    #define SKYLINE_API __declspec(dllexport)
#elif defined(__GNUC__)
    #define SKYLINE_API __attribute__((visibility("default")))
#else
    #define SKYLINE_API
#endif

最後,得必須明確告知 DLL 需要包含哪些程式,所以需要包進去的程式需要改成如下的內容

#include "skyline_api.h" //要加上相關設定內容

class SKYLINE_API GraphicsEngine //加上 SKYLINE_API 的標記
{
    // 原本的宣告
};

最後,建置時輸入下面指令,就能看到相關檔案了

cmake -S . -B out/build/dll-ninja -G Ninja -DCMAKE_BUILD_TYPE=Debug -DCMAKE_TOOLCHAIN_FILE=./vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows -DBUILD_TESTING=ON
cmake --build out/build/dll-ninja --parallel 4
ctest --test-dir out/build/dll-ninja --output-on-failure

上一篇
Day 26:用 Catch2 寫測試
下一篇
Day 28:Tracy 導入
系列文
因為 AI 看不懂老舊程式,只好乖乖從零開始學 DirectX 12 與 HLSL 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言