Java 搞久了也不爽,所以最近開(kāi)始學(xué) Windows 開(kāi)發(fā),擴(kuò)展下知識(shí)面。首先推薦一本好書(shū)——《Windows System Programming》第四版,今年才出版,內(nèi)容絕對(duì)前衛(wèi)呵呵。
本來(lái)已經(jīng)下載了 Visual Studio 2010,但是看了看那肥碩的身軀,還是龜縮回了以前用過(guò)的 NetBeans + MinGW,麻雀雖小五臟俱全嘛。一開(kāi)始還是比較順利的,編譯鏈接什么的都很華麗。不過(guò)當(dāng)我嘗試進(jìn)行 Unicode 編譯時(shí),問(wèn)題就來(lái)了(UNICODE
和 _UNICODE
都定義了)。問(wèn)題出在 _tmain
:
- int _tmain(int argc, LPTSTR* argv, LPTSTR* envp) {
編譯順利,但是出現(xiàn)詭異的鏈接錯(cuò)誤:
- c:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.5.1/../../../../x86_64-w64-mingw32/lib/libmingw32.a(lib64_libmingw32_a-crt0_c.o): In function `main':
- c:/crossdev/src/mingw-w64-svn/mingw-w64-crt/crt/crt0_c.c:18: undefined reference to `WinMain'
- collect2: ld returned 1 exit status
去網(wǎng)上查了好一陣,發(fā)現(xiàn)這個(gè)是 MinGW 的老問(wèn)題了。在 Unicode 環(huán)境下,宏 _tmain
展開(kāi)為 wmain
,而 MinGW 不支持 wmain
……綜合網(wǎng)上找到的各種解決方案,改成下面的代碼就能順利鏈接了:
- extern int _CRT_glob;
- extern
- #ifdef __cplusplus
- "C"
- #endif
- void __wgetmainargs(int*, LPTSTR**, LPTSTR**, int, int*);
- int main() {
- int argc;
- LPTSTR* argv;
- LPTSTR* envp;
- int si;
- __wgetmainargs(&argc, &argv, &envp, _CRT_glob, &si);
其實(shí)不管是 wmain
、_tmain
還是其他什么稀奇古怪的 main
,只要把命令行參數(shù)和環(huán)境變量正確解析出來(lái)就行了。希望今后 MinGW 能正確支持 _tmain
,畢竟這樣寫(xiě)還是有點(diǎn)丑陋呵呵。