最近為了編寫64位的應用程序,我把 CodeBlocks 16.01 升級到 CodeBlocks 20.03
CodeBlocks 16.01 自帶的 gcc 是 tdm-gcc 4.9.2
CodeBlocks 20.03 自帶的 gcc 是 w64-mingw32-gcc 8.1.0
使用 CodeBlocks 20.03 自帶的 w64-mingw32-gcc 8.1.0 重新編譯過去寫的代碼,有很多新的代碼警告提示,竟然還找到了一處指針錯誤代碼(返回局部變量的指針),新版本的gcc確實很給力。
注意:編譯器由原來的 tdm-gcc 4.9.2 變成 w64-mingw32-gcc 8.1.0 后,編譯出來的應用程序運行時需要依賴3個dll文件:
64位應用程序依賴3個dll文件分別是:
libgcc_s_seh-1.dll libwinpthread-1.dll libstdc++-6.dll
32位應用程序依賴3個dll文件分別是:
libgcc_s_dw2-1.dll libwinpthread-1.dll libstdc++-6.dll
由於以前用 tdm-gcc 好幾年,編譯生成的應用程序不需要依賴這3個dll文件,為了編譯出的應用程序不依賴這3外dll文件,我又嘗試下載了 tdm-gcc 9.2,官網下載:https://jmeubank.github.io/tdm-gcc/
下載后,為 CodeBlocks 20.03 配置好相關的編譯路徑后:
使用 tdm-gcc 9.2 重新編譯之前的代碼,直接報了多處錯誤提示:
然后編輯文件:TDM-GCC-9.2-32\include\sdkddkver.h
#ifndef _WIN32_WINNT # ifdef WINVER # define _WIN32_WINNT WINVER # else # ifdef _WARN_DEFAULTS # warning "Assuming default setting of _WIN32_WINNT_WIN2K for _WIN32_WINNT" # endif # define _WIN32_WINNT _WIN32_WINNT_WIN2K # endif #endif
_WIN32_WINNT 默認是 _WIN32_WINNT_WIN2K,修改為: 0x0501 (win xp)
#ifndef _WIN32_WINNT # ifdef WINVER # define _WIN32_WINNT WINVER # else # ifdef _WARN_DEFAULTS # warning "Assuming default setting of _WIN32_WINNT_WIN2K for _WIN32_WINNT" # endif # define _WIN32_WINNT 0x0501 # endif #endif
重新編譯,在快要編譯完成的時候,360 彈出安全對話框,說什么 collect.. 之類的存在安全風險。
嚇的我沒敢繼續。
我又想起 CodeBlocks 17.02 這個版本自帶的是 tdm-gcc 5.1,我又在另一台電腦上安裝了這個版本,然后提取 tdm-gcc 5.1,重新編譯的代碼,又提示這個錯誤:
關於這個錯誤,我有印像,以前也有,好像重新定義一個.h 文件中的宏定義就行了。
可我實在不想再改代碼了,就放棄了。
-----------------------------------------------------------------------------------------------------------------------
以后,就只使用 CodeBlocks 20.03 自帶的 w64-mingw32-gcc 8.1.0 來編譯吧,就算編譯出來的應用程序需要依賴那3個dll,但至少代碼這一塊我不需要改動太多,從代碼維護角度看,省心一些吧。