window下MinGW 產生dll

來源:互聯網
上載者:User

MinGW是指只用自由軟體來產生純粹的Win32可執行檔的編譯環境,它是Minimalist GNU on Windows的略稱。詳情請參考<>。
這裡的“純粹”是指「使用msvcrt.dll的應用程式」。無法使用MFC (Microsoft Foundation Classes)。
MinGW:一個可自由使用和自由發布的Windows特定標頭檔和使用GNU工具集匯入庫的集合,允許你產生本地的Windows程式而不需要第三方C執行階段程式庫。
MinGW,即 Minimalist GNU For Windows。它是一些標頭檔和連接埠庫的集合,該集合允許人們在沒有第三方動態連結程式庫的情況下使用 GCC(GNU Compiler C)產生 Windows32 程式。

在基本層,MinGW 是一組包含檔案和連接埠庫,其功能是允許控制台模式的程式使用微軟的標準C已耗用時間庫(MSVCRT.DLL),該庫在所有的 NT OS 上有效,在所有的 Windows 95 發行版以上的 Windows OS 有效,使用基本已耗用時間,你可以使用 GCC 寫控制台模式的符合美國標準化組織(ANSI)程式,可以使用微軟提供的 C 已耗用時間擴充。該功能是 Windows32 API 不具備的。下一個組成部分是 w32api 包,它是一組可以使用 Windows32 API 的包含檔案和連接埠庫。與基本已耗用時間相結合,就可以有充分的權利既使用
CRT(C Runtime)又使用 Windows32 API 功能。
MinGW 官方網站為
實際上 MinGW 並不是一個 C/C++ 編譯器,而是一套 GNU 工具集合。除開 GCC (GNU 編譯器集合) 以外,MinGW 還包含有一些其他的 GNU 程式開發工具 (比如 gawk bison 等等)。

開發 MinGW 是為了那些不喜歡工作在 Linux(FreeBSD) 作業系統而留在 Windows 的人提供一套符合 GNU 的 GNU 工作環境。
(此前的 cygwin 雖然也是 GNU 的 Windows 移植,但是 cygwin 是有著作權的,而不是 GNU。)
所以,使用 MinGW 我們就可以像在 Linux 下一樣使用 GNU 程式開發工具。
GCC 就是 MinGW 的核心所在,GCC 是一套支援眾多電腦程式語言的編譯系統,而且在語言標準的實現上是最接近於標準的。並且 GCC 幾乎可以移植到目前所有可用的電腦平台。(我的電腦上就還裝有 DevKitPro,裡麵包含 GCC 的 ARM(for GBA/DS/GP32) 和 MIPS(for PSP) 版本。)

GCC 本身不像 VC 那樣擁有 IDE 介面(在 Windows 上也存在 Dev C++ 之類的支援 MinGW 編譯器的 IDE)。原始碼編輯你可以選用任何你喜歡的文字編輯器(據說微軟的開發人員包括 VC 的開發都不用 VC 所帶的 IDE 編輯器,而是選用 GNU 的 VIM 編輯器)。然後使用 make 等工具來進行軟體項目的編譯、連結、打包乃至發布。而像 cvs(svn) 原始碼版本控制工具可以讓世界上任何一個角落的人都可以參與到軟體項目中來。

關於 MFC,微軟基礎庫類,這個隨 VC++ 攜帶的一個原始碼公開的開發包,和其他 Windows 程式開發包是一樣的。如果有 VC++ 的授權,你完全可以使用 MFC 的原始碼,也就是你使用 GCC 來編譯 MFC 程式是完全可以的。

當然,GNU 下也很多 Windows 程式開發包,甚至有一些是支援跨平台使用的。不僅僅可以直接把原始碼編譯為 Windows 程式,也可以不經修改編譯為其他動作系統的圖形程式。

不過 GNU 下,最流行的圖形介面開發庫是 GTK+。GTK+ 也能很好的運行在 Windows 平台(比如 GIMP 和 Gaim)。
總體說來,使用 MinGW 就是 GNU。

基本用法:
在mingw環境中產生和使用dll都是十分方便的。
1.產生dll
gcc(g++) -shared -o test.dll test.c(test.cpp)
通過該命令產生test.dll,將匯出test.c中非靜態函數和相關的類。

(注by asper:該命令列在處理jni涉及的dll時無效)
我使用微軟C++編譯器,cl命令對帶有空格的路徑也是無效的,需要用""括住

2.串連dll到exe中
mingw使用dll的方式和靜態庫.a的方式是一樣的,串連的時候只需要加上-ltest即可,沒有lib首碼的要求。
3.編寫jni調用的dll
有辦法了! 是gcc少了行參數。 如下:
gcc -I%JAVA_HOME%\include -I%JAVA_HOME%\include\win32 -Wl,--add-stdcall-alias -shared -o call.dll call.c

參數:-Wl,--add-stdcall-alias 可以為函數加上標準調用首碼(stdcall @nn)。
這樣編譯出的dll就可以了。都知道win32中dll中的函數要求有標準調用首碼,在JNI中不方便手動處理這個,Sun又沒說清楚這事由編譯器辦。所以搞得我很鬱悶。找了大半個月,終於在一個很古老的網頁上找到答案。

基本上和VC的介面差不多 學習C語言用的最多的還是VC++ 6.0

如果對您有協助,請記得採納為滿意答案,謝謝!祝您生活愉快!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.