Home 介紹 DLL (Dynamic Link Library)(1/2)(中文)
Post
Cancel

介紹 DLL (Dynamic Link Library)(1/2)(中文)

DLL 到底是啥 ?

當你在 Windows 上開發程式,或是在 Windows 上面隨便瀏覽系統的資料夾,一定常常看到 .dll 的檔案, 還有團隊內的長輩常常說 “把 XXX 功能包成 dll” 給其他模組使用..etc

講得很神,Dll 到底是啥?

DLL (Dynamic Link Library) 是一種在微軟 Windows 作業系統中常見的檔案格式。它是一種可重複使用的程式庫,其中包含了程式碼、資料和資源,供應用程式在執行時使用。

題外話, 在 Linux 上有共享函式庫(shared libraries),在 macOS 上有動態共享函式庫(dynamic shared libraries), 概念都和 DLL 差不多。

DLL 檔案通常包含一組功能或函式,它們可以被其他程式存取和使用。這樣的程式庫提供了一種模組化的方法,讓開發人員能夠將程式碼分割成小的、獨立的單元,以便於管理和維護。當應用程式需要使用這些功能時,它們可以動態地連結到 DLL 檔案,並調用其中的函式,而不需要將整個功能重新寫一遍。

有什麼好處 ?

使用 DLL 的好處包括節省記憶體空間(因為多個應用程式可以共享同一個 DLL 的實例)、簡化程式碼的維護和更新(只需更新 DLL 檔案而不需要修改每個使用它的應用程式)、以及提高程式執行效率(因為程式碼可以被重複使用,並且優化過的函式可以在不同的應用程式中共享)。

聽起來真是不錯的東西!!

如何 export DLL ?

直接看 code 解釋最快

1
2
3
4
5
6
#include "pch.h"

extern "C" __declspec(dllexport) int MyFirstFunction(int a, int b)
{
    return a + b;
}

以上寫了個加法的 function

__declspec(dllexport) 指示編譯器將函式導出到 DLL 中,讓其他模組可以用

extern "C" 主要用於告知 C++ 編譯器,該函式按照 C 語言的規則進行編譯和連結,而不是按照 C++ 的名稱修飾方式進行處理。

到底在說啥 ? 當我們在 C++ 程式碼中定義一個函式時,C++ 編譯器會對該函式的名稱進行修飾(Name Mangling),以處理函式的重載和類型安全等問題。這使得 C++ 與其他語言(例如 C、C#、Python 等)進行函式互操作時變得困難,因為不同的編譯器可能有不同的名稱修飾方式, 結論,使用 C++ 與其他語言(例如 C、C#、Python 等)進行介面或互操作時,記得要加 extern "C"

Name Mangling

既然都提到了,就順便解釋一下

C++ Name Mangling(名稱修飾)是 C++ 編譯器為了支援函式重載(overloading)和函式模板(function templates)等特性所進行的一種名稱處理機制。

當你在 C++ 中定義多個具有相同名稱的函式,它們可能具有不同的參數類型、參數個數或 const/volatile 修飾符,這種情況下就會發生函式重載。為了確保這些函式可以在連結時正確地識別,編譯器會對這些函式的名稱進行修改,這個過程稱為名稱修飾。

名稱修飾的方式通常是在函式名稱前加上一些額外的字元或數字,以便區分不同的函式。這樣做的好處是可以達到函式重載的目的,同時在連結時可以識別不同的函式。

例如,假設有以下兩個函式:

1
2
void foo(int x);
void foo(double y);

在名稱修飾後,這兩個函式可能變成

1
2
void _Z3fooi(int x);
void _Z3food(double y);

這樣做的好處是,即使這兩個函式都具有相同的名稱 foo,但它們的名稱在連結時是不同的,因此編譯器可以正確地識別和連結它們。 也可以說不是給人看的拉。

好啦,以上是初步的了解。 之後再介紹你拿到 DLL 如何使用、及如何將 class, struct 變成 DLL 讓其他模組呼叫

☝ツ☝

This post is licensed under CC BY 4.0 by the author.

👈 ツ 👍