炫彩好望角 The Colorful Cape of Good Hope

庸人不必自扰,智者何需千虑?

常用链接

统计

最新评论

MinGW 环境下的 Unicode 编译

Java 搞久了也不爽,所以最近开始学 Windows 开发,扩展下知识面。首先推荐一本好书——《Windows System Programming》第四版,今年才出版,内容绝对前卫呵呵。

本来已经下载了 Visual Studio 2010,但是看了看那肥硕的身躯,还是龟缩回了以前用过的 NetBeans + MinGW,麻雀虽小五脏俱全嘛。一开始还是比较顺利的,编译链接什么的都很华丽。不过当我尝试进行 Unicode 编译时,问题就来了(UNICODE_UNICODE 都定义了)。问题出在 _tmain

  1. int _tmain(int argc, LPTSTR* argv, LPTSTR* envp) {

编译顺利,但是出现诡异的链接错误:

  1. 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':
  2. c:/crossdev/src/mingw-w64-svn/mingw-w64-crt/crt/crt0_c.c:18: undefined reference to `WinMain'
  3. collect2: ld returned 1 exit status

去网上查了好一阵,发现这个是 MinGW 的老问题了。在 Unicode 环境下,宏 _tmain 展开为 wmain,而 MinGW 不支持 wmain……综合网上找到的各种解决方案,改成下面的代码就能顺利链接了:

  1. extern int _CRT_glob;
  2. extern
  3. #ifdef __cplusplus
  4. "C"
  5. #endif
  6. void __wgetmainargs(int*, LPTSTR**, LPTSTR**, int, int*);
  7. int main() {
  8.     int argc;
  9.     LPTSTR* argv;
  10.     LPTSTR* envp;
  11.     int si;
  12.     __wgetmainargs(&argc, &argv, &envp, _CRT_glob, &si);

其实不管是 wmain_tmain 还是其他什么稀奇古怪的 main,只要把命令行参数和环境变量正确解析出来就行了。希望今后 MinGW 能正确支持 _tmain,毕竟这样写还是有点丑陋呵呵。

posted on 2010-11-04 21:46 蜀山兆孨龘 阅读(3512) 评论(2)  编辑 收藏 引用 所属分类: Windows

评论

# re: MinGW 环境下的 Unicode 编译 2010-11-06 08:25 vckbase

C/C++规定的主函数只有唯一名称 main  回复  更多评论   

# re: MinGW 环境下的 Unicode 编译 2010-11-06 13:43 千兆个亿

是的,标准 C / C++ 只有一个 main,但微软从来都不是个守规矩的家伙,所以就自己扩展了一个 wmain……  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理