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

2022-05-05 23:24:14 字數 1607 閱讀 7835

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

1、mingw 如何使用乙個標準的 dll。這裡標準 dll 指的是採用 __stdcall 呼叫協議、並且匯出函式名稱乾乾淨淨,沒有函式名尾部的 @nn、沒有函式名頭部的下劃線的。mingw 的 g++ 程式中,對於需要從 dll 中匯入的函式,宣告時必須要用 extern "c",但不要用 __declspec(dllimport),雖然 g++ 支援,但是一旦你使用,則 g++ 在鏈結時會自動強制在需要匯入的函式名前加 _imp__ 字首,導致鏈結時找不到函式名錯誤。所以,我們其實完全不需要用 __declspec(dllimport)。另一方面,gcc/g++ 編譯器遇到**中 __stdcall 修飾的函式名,會自動將其函式名在鏈結時設定為函式名@nn,nn 是函式引數棧位元組數。另外,gcc/g++ 編譯器/鏈結器在鏈結時其實不需要 dll 的導入庫(import lib),因為它們可以直接從 dll 鏈結,這樣更加方便,省去了很多從 dll 如何生成符合格式要求的 .a 導入庫等問題。只需要在 gcc/g++ 引數中加入 -wl,--enable-stdcall-fixup -l../../bin/ -ldll檔名(不含.dll)即可直接從 dll 檔案本身完成鏈結。這裡要注意,-wl引數指示 g++ 鏈結器需要採用後面的鏈結控制引數(以逗號分隔),--enable-stdcall-fixup 告訴 g++ 鏈結器需要匯入的 dll 函式的名字需要自動在尾部加上 @nn 格式的字尾,以便符合 gcc/g++ 對 __stdcall 函式名的擴充套件規範。-l 指定 dll 檔案所在目錄,-l 指定 dll 檔名稱,不帶 .dll。如果不加 --enable-stdcall-fixup,gcc/g++ 總是會報鏈結錯誤,因為 gcc/g++ 將**中需要從 dll 匯入的函式名後面都強制加了 @nn,但是 dll 中的函式名不帶 @nn,沒有 --enable-stdcall-fixup,很有可能就會出錯。即時不出錯,也會有很多警告,很有可能會導致程式 crash!注,在 netbeans cdt 中,-wl,--enable-stdcall-fixup -l -l 這樣的引數在鏈結器引數設定中指定。

2、mingw 如何建立乙個標準的 dll。mingw 中建立標準 dll,應該使用 __declspec(dllexport),包括 extern "c" 等都是和 vc 一樣的。但要注意,這樣編譯鏈結生成的 dll,匯出的函式名尾部都帶有 @nn,為了要去除它們,必須在鏈結器引數設定中使用 -wl,--kill-at,它告訴鏈結器建立 dll 時匯出的函式名尾部不要帶有 @nn。注,在 netbeans cdt 中,上面這個引數同樣是在鏈結器引數設定中指定。

綜上,如果建立乙個 dll,同時這個 dll 又需要匯入其他 dll 的函式,引數就可以統一為 -wl,--kill-at,--enable-stdcall-fixup -l -l 這樣了,很方便。感覺 mingw 確實相當強悍,跨平台,可調性很靈活,效能也很強勁,更難能可貴的是,它是乙個免費而又強大的編譯器!當然,搭配 netbeans cdt 更是相當好的一款 c/c++ 開發利器。

在MinGW下建立DLL

在許多情況下使用dll是乙個糟糕的主意,但對於新手來說學會如何建立dll,尤其是乙個免費的開發環境例如mingw將意味著對開發工具的快速熟悉並能了解那些看起來隱含的選項。在繼續下面的內容之前,你應該已經安裝並且配置好了mingw。同樣你應該對缺少ide環境的程式設計比較熟悉,或者知道如何在ide環境...

VC 使用 MinGW編寫的dll

參考文章 因為對ia32彙編格式不熟悉 所以寫了一些用c內嵌gnu彙編的 來獲取cpu的資訊,想用vc來做介面,c函式用mingw在windows平台編譯,完事遇到乙個問題,gcc編譯出來的dll檔案vc無法識別,於是昨天晚上和今天下午都在查詢資料,下面是我整理來的,不知道這樣用合不合適啊,不合適你...

MinGW安裝和使用

p.s.安裝mingw主要是code blocks 編譯出現了這個問題 error you need to specify a debugger program in the debuggers s settings.for mingw compilers,it s gdb.exe without ...