在MinGW下建立DLL

2021-08-22 07:52:18 字數 2042 閱讀 3506

在許多情況下使用dll是乙個糟糕的主意,但對於新手來說學會如何建立dll,尤其是乙個免費的開發環境例如mingw將意味著對開發工具的快速熟悉並能了解那些看起來隱含的選項。

在繼續下面的內容之前,你應該已經安裝並且配置好了mingw。同樣你應該對缺少ide環境的程式設計比較熟悉,或者知道如何在ide環境下使用mingw。這裡就不再對此進行詳細說明了。

什麼是dll

什麼是dll呢?dll全稱dynamically linked libraries (動態連線庫)。它和靜態連線庫有什麼區別呢?在靜態連線庫中,

97tb-教中38v)絡提0*c-g

連線是在編譯時完成的,庫函式**被新增到了主程式中。而在執行時完成連線的就叫動態連線。因為連線是在執行時完成的,顯然作業系統將為此做一些幕後工作。這也是為什麼大多數dll不可移植的原因。

當乙個引用了dll的可執行檔案被載入,作業系統查詢所有包含"imports"的連線,也就是查詢使用了dll功能的地方。然後作業系統去查詢具體的dll,如果在dll中找到和這個"imports"匹配的"exports",作業系統會對此做乙個對映。這樣可執行檔案呼叫乙個"imports"函式,dll中的**將會執行。哇,

cffk;`jg.:/jpr?

這就是動態連線。

hello dl

下面我將描述乙個"hello world"的實現。**由三個檔案組成:hello.c、dll.h和dll.c。

**如下:

hello.c

#include

#include

int main()

除了hello()函式使用動態連線外,

hello.c是乙個標準的hello world c程式。唯一特別的地方就是它包含了乙個dll.h檔案。

dll.h

#ifdef build_dll

/* dll export */

#define export __declspec(dllexport)

#else

/* exe import */

#define export __declspec(dllimport)

#endif

export void hello(void);

dll.h有一些技巧性的東西在裡面。它檢查這個build_dll巨集。當我們編譯時將手動設定build_dll巨集,這時候巨集export被設定成__declspec(dllexport)。這樣gcc就能編譯這個dll。當從可執行檔案中呼叫dll時,build_dll巨集沒有被設定,export巨集被設定成__declspec(dllimport), 它將使函式在呼叫範圍內可見。

__declspec(dllexport)和__declspec(dllimport)是用來建立dll的巨集。

dll.c

#include "dll.h"

export void hello(void)

這是hello world 實際實現**,

?無專供:網snd,_

這裡沒有什麼特別的。

編譯連線程式

1、 編譯hello.c

gcc -c hello.c

2、 編譯dll.c

gcc -c -dbuild_dll dll.c

注意要使用要使用-dbuild_dll來設定巨集build_dll

3、 建立dll

gcc -shared -o message.dll dll.o -wl,--out-implib,libmessage.a

這一步要詳細說明一下

-shared引數用來建立共享庫,在windows中為dll

-wl 等待下一條資訊進行連線

--out-implib是給連線程式ld使用的,用於建立要連線dll需要的import library

4、 建立可執行檔案

gcc -o hello.exe hello.o -l./ -lmessage

-l 指定連線庫路徑

-lmessage (or -l message) 指定dll的import library

好了,編譯連線完成,執行程式

c:/>hello

hello!

mingw 在LINUX下編譯WINDOWS程式

ubuntu下可以直接安裝 sudo apt get install mingw32 mingw32 binutils mingw32 runtime 安裝後編譯程式可以 i586 mingw32msvc g 編譯c 程式 i586 mingw32msvc gcc 編譯c程式 用法和gcc g 非常...

MinGW 使用和建立 DLL 應注意的問題

mingw 是 gcc 的 windows 版本,穩定版已經到了 4.5.2,功能和效能上很好,感覺不比 microsoft 自家的 vc 差啊。但是 mingw 下使用和建立 dll 倒是要特別注意,問題主要集中在 g 編譯器 c 的 gnu 版本編譯器 對於 dll 的函式輸入以及輸出的名稱修飾...

MinGW編譯dll並引用

記得某位神仙曾經說過 乙個專案不使用dll簡直是一場災難。滑稽 這篇文章以a b a b為範例,來介紹如何在mingw下編譯dll並引用。include using namespace std define export declspec dllexport extern c int a b int...