Tommy 碎碎念

Tommy Wu's blog

« 上一篇 | 下一篇 »

MinGW 使用 gcc 4.5.x 產生的執行檔需要 libgcc_s_dw2-1.dll 與 libstdc++-6.dll 才能執行?
post by tommy @ 24 三月, 2011 15:14

這兩天為了編譯 SciTE (以前都是 VC++ 來編譯), 所以把使用的 MinGWgcc 升級到 4.5.x, 結果, 發現產生的執行檔在執行的時候, 需要 libgcc_s_dw2-1.dll 與 libstdc++-6.dll 才能運作. 網路上查了一下, 發現 gcc 4.5 預設對所有函式庫的連結方式都改成動態連結, 所以做出來的執行檔依據所使用到的函式庫, 往往會需要一些原本不存在 Windows 系統的 dll 才能正常運作.

當然, 只要也附上這些相關的 dll 一樣可以正常運作. 不過.... 如果想要只要單獨的一個執行檔就能運作時, 要怎麼處理呢?

gcc 的文件中有提到下面三個參數:

  • -static-libgcc
在 gcc/g++ 或 ld 中加上這個參數, 就可以不用 libgcc_s_dw2-1.dll
  • -static-libstdc++
在 g++ 或 ld 中加上這個參數, 就可以不用 libstdc++-6.dll
  • -static
在 gcc/g++ 或 ld 中加上這個參數, 對所有的函式庫都會採靜態連結的方式

我在 SciTE 的編譯上, 使用 -static-libgcc 加上 -static-libstdc++ 或只用 -static 都可以產生不需要這些 dll 的執行檔. 不過.... 對於 SciTE 產生的 dll 檔案, 加上這些參數後反而不能正常運作.

後來, 拿 FileZilla 3.4.0-rc1 來測試時, 發現這類用 configure 產生 Makefile 的做法, 加上前兩個參數時, 對某些程式會有問題, 因為這些程式產生的 Makefile, 裡頭的 CPPFLAGS (奇怪的是某些 c 的程式, 非 c++ 的程式也用這個變數, 而不是用 CFLAGS 這個變數) 或 LDFLAGS 似乎也會有別的程式用, 這時會不認得這個參數而發生錯誤. 若改用 -static 這個參數, 好像就比較不會有問題, 不過.... 在 FileZilla 上頭, 這樣弄出來的執行檔還是需要一堆 dll 才能用.

弄來弄去, 最後雖然可以讓 FileZilla 產生不要 dll 的執行檔, 不過.... 過程總覺得太麻煩, 難道就沒別的方法了嗎? (所以... FileZilla wiki 上頭有關 Windows 下編譯的那篇文章應該不太對, 可能是還沒寫好吧, 不然照著做出來的執行檔是需要有 dll 才能動, 與作者 release 的版本不一樣)

後來發現 TDM-GCC 有提供兩個不同版本的 gcc 4.5.1, 一個是 dw2 (看起來應該就與 MinGW 本身的一樣, 就是要用 libgcc_s_dw2-1.dll 的這個版本), 另一個是 sjlj. 所以就拿 sjlj 的版本來用看看, 果然... 與 3.x 版的 gcc 一樣, 預設就是採用靜態連結的方式, 不用加上任何參數. 這樣子, 至少我碰的多數程式, 都可以不用改就能用了.

如果有同樣問題的, 建議也改用 TDM-GCC sjlj 版本吧.

Del.icio.us Furl HEMiDEMi Technorati MyShare
迴響
暱稱:
標題:
個人網頁:
電子郵件:
authimage

迴響

  

Bad Behavior 已經阻擋了 57 個過去 7 天試圖闖關的垃圾迴響與引用。
Power by LifeType. Template design by JamesHuang. Valid XHTML and CSS