Java 搞久了也不爽,所以最近开始学 Windows 开发,扩展下知识面。首先推荐一本好书——《Windows System Programming》第四版,今年才出版,内容绝对前卫呵呵。
本来已经下载了 Visual Studio 2010,但是看了看那肥硕的身躯,还是龟缩回了以前用过的 NetBeans + MinGW,麻雀虽小五脏俱全嘛。一开始还是比较顺利的,编译链接什么的都很华丽。不过当我尝试进行 Unicode 编译时,问题就来了(UNICODE
和 _UNICODE
都定义了)。问题出在 _tmain
:
- int _tmain(int argc, LPTSTR* argv, LPTSTR* envp) {
编译顺利,但是出现诡异的链接错误:
- 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
去网上查了好一阵,发现这个是 MinGW 的老问题了。在 Unicode 环境下,宏 _tmain
展开为 wmain
,而 MinGW 不支持 wmain
……综合网上找到的各种解决方案,改成下面的代码就能顺利链接了:
- 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);
其实不管是 wmain
、_tmain
还是其他什么稀奇古怪的 main
,只要把命令行参数和环境变量正确解析出来就行了。希望今后 MinGW 能正确支持 _tmain
,毕竟这样写还是有点丑陋呵呵。