close

在砍掉重練之前請三思:不必自宮也能成功。

2011/09/20 補充:
一般安裝使用請參考 使用 mingw-get 安裝 MinGW 和 MSYS


基本上沒有純手工安裝 MinGW 的必要,官網提供的自動安裝程式沒太大的問題,有需要的人再額外抓些套件如 GDB 和 pexports 即可。官網的自動安裝程式安裝的是有點舊的 gcc-3.4.5,若需要 gcc-4 以後版本的人可以選擇 Twilight Dragon 的 MinGW package,他們提供最新的 GCC。

在上一篇介紹完 msys 之後,我也順手試了一下純手工裝 MinGW,所以就有了這篇,提供給有需要的人。所提到的檔案可在此下載
http://sourceforge.net/projects/mingw/files/MinGW/
注意,很多東西的名稱和 msys 下的項目一樣,但意義截然不同。請下載 MinGW下的東西,不要抓 msys 的,不清楚原因的人可以看上一篇。(雖然我沒試過,不過我大膽的猜測很多東西即使搞混也動得起來)


先談談最小能動的安裝。在 gcc 3.x 的時代,如果只打算寫 C 的話,只要 binutils、gcc-core、mingw-rt、Win32 API 四個套件即可。然而最近幾年內有編譯過 gcc 的網友可能會知道,自從 gcc-4.3 之後,就必須依賴 gmp 和 mpfr;到了 4.5 又增加了對 mpc 的依賴。

所以當我只用 binutils、gcc-core、mingw-rt、Win32 API 踢到鐵板時,並沒有感到太意外,把額外三個 lib 的 dll補上即可,我撰文前(2010年8月7日)所得到的版本:
在 MinGW/BaseSystem/ 項目下載
  binutils-2.20.51-1-mingw32-bin.tar.lzma
  gcc-core-4.5.0-1-mingw32-bin.tar.lzma
  mingwrt-3.18-mingw32-dev.tar.gz
  w32api-3.14-mingw32-dev.tar.gz
在 MinGW/ 項目下載
  libgmp-5.0.1-1-mingw32-dll-10.tar.lzma
  libmpc-0.8.1-1-mingw32-dll-2.tar.lzma
  libmpfr-2.4.1-1-mingw32-dll-1.tar.lzma
補充
官網還建議加上ssp、OpenMP(libgomp),不過缺乏這二者仍然可以執行一般的編譯工作,只是某些功能無法使用。

下載完直接解壓到同一個資料夾下。但即使解壓完應該還是不能動,因為dll預設裝在 mingw\bin 下,但有些執行檔不在同個資料夾下,所以找不到 dll。大致上沒有別的辦法,一種做法就是向系統註冊這些 dll,或者是放到系統可以自動找到 dll 的地方;不過我不喜歡太過侵入式方法,所以選擇把 mingw\bin 加到系統的 PATH 變數裡。裝完之後,我從電腦裡隨便翻出了個小程式來測,編譯執行順利,這個小程式使用了 stdio.h、stdlib.h、math.h 的多個函數,應該蠻具有代表性的。以上應該就是 gcc-4.5 在 Windows 上最簡安裝。

接下來裝 make,沒甚麼好說的。但要注意名稱,若打算和 msys 合作,為了避免和 msys 自己的 make 撞名,最好是保留 mingw32-make.exe 的檔名。若是和其他的IDE合作,可能得配合其他程式呼叫方便。我這裡取得的 package 是
mingw32-make-3.81-2.tar.gz

再來安裝 C++、GDB,我所取得的是
gcc-c++-4.5.0-1-mingw32-bin.tar.lzma
libstdc++-4.5.0-1-mingw32-dll-6.tar.lzma
gdb-7.1-2-mingw32-bin.tar.gz
有人反映最近幾版 GDB 似乎和 mingw 有點不相容的問題,我不曉得用舊一點的版本會不會比較好。


至此已經是個完整的標準 C、C++ 開發環境,接下來要裝哪些套件就隨個人喜好添加。這裡對package做一點補充。

Pascal以外的其他語言編譯器和其直屬程式庫都可在 MinGW/BaseSystem/GCC/ 項目下取得,下載項目是「gcc-名稱-版號-bin」。另外如果我們動態連結標準程式庫,那麼也必須把 dll 提供給使用者,這時「libg名稱-版號-dll」就是我們所需的 dll。例如 Ada 對應的dll是libgnat,fortran則是libgfortran。這裡要特別提醒的是,GCC 4.5 預設所有的標準程式庫都是動態連結,包含C和C++,如果未加上連結選項 -static-libgcc 和 -static-libstdc++,那麼編譯出來的程式就需要依賴這兩個 dll,無法在缺乏此 dll 的電腦上執行。即使確定採用預設的動態連結,也需要額外補上-Wl,--enable-auto-import ,否則連結出來的執行檔不正確。無論如何,舊有的 makefile 都要重新調整。若不喜歡這些,記得我之前用的版本,忘掉是4.2還4.3,沒有這方面的問題。

在 MinGW 下還有一些有用的程式庫,應該很容易注意到有不少和 msys 名稱相同。在裝 msys 時通常我們的角色是「msys 使用者」,所以下載以 bin 和 dll 為主,而 mingw 時我們的角色變成了「Win32 開發者」,所以應該下載這些程式庫的 dev 和 dll。通常 dev 包含了開發程式所需的 headers 和 libs,dll 是只有當動態連結這些程式庫的時候才需要,如果保證只用靜態連結就只需要 dev 而已。容我再三提醒一次,msys 的套件和 MinGW 套件的用意很不一樣,千萬不要因為名稱相同就混再一起。

假如說我們想運用 gmp 程式庫開發一個高精度運算的程式,那麼 gmp 的 dev package 就是居家必備,而 dll package 則是自用送人兩相宜。

最後介紹一些套件,僅供參考
pthread: 最近我大多用boost.thread,不過 pthread 還是比較廣為接受。還有,說真的,絕大多數在 Win32 環境下呼叫 CreateThread() API 的 C/C++ 使用者都不知道自己會造成 memory leak。

pexports: 一個小程式,可以從PE格式 binary 當中 dump 出一些有用的資訊,有點像 VC++ 的 dumpbin。作一些library開發及使用時極有用。

PDCurses: 可以對 console 畫面進行一些複雜的操作,像是輸出如 telnet client 那樣的彩色畫面。不過對我沒啥用就是了....

gmp和mpfr: 高精度數學計算程式庫。前面已經裝過 dll 套件,如果自己要開發程式須另裝 dev 套件

reimp、a2dll: 很神奇的library轉檔工具,在 Utilities/mingw-utils 之下

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 novus 的頭像
    novus

    novus log

    novus 發表在 痞客邦 留言(1) 人氣()