在許多情況下使用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...