使用MinGW+MSYS开发

你是否厌倦了Visual Studio那庞大的开发环境?
你是否对抓来的源码发现只有一个makefile文件而没有.csproj或者.sln文件而束手无策?
你是否觉得为了模拟一个可以使用gcc、gdb的拟linux环境而使用虚拟机或者cygwin过于浪费?

如果上面三个问题的答案都是Yes,那么下面这个编译环境是为你准备的

MinGW+MSYS

MinGW | Minimalist GNU for Windows
Compiler system uses GCC to produce Windows programs. Win32 ports of GCC, GDB, binutils to build native Win32 programs that rely on no 3rd party DLLs.

MSYS | Minimal System
A collection of GNU utilities such as bash, make, gawk and grep to allow building of applications and programs which depend on traditionally UNIX tools to be present. It is intended to supplement MinGW and the deficiencies of the cmd shell.

官网:http://www.mingw.org/

以下引自”MSYS-CN”:http://code.google.com/p/msys-cn/
MSYS不是一个操作系统,而是一个通过将Linux源代码在Win32上编译而成的UNIX工作环境;
MSYS类似于Cygwin,但是由于工作原理的不同,速度更快、体积更小、功能强大、便于携带;
使用MSYS可以完整的取代商业的VC环境,同样开发出商业版权的程序而不受任何版权限制;

出于网络原因(作者在GFW外,翻进去很难),本文采用原版MinGW而不使用MSYS-CN,如果对MSYS-CN有兴趣,请自行研究。

安装MinGW

其实安装MinGW一直很麻烦,08年我编译FileZilla的时候折腾了很大劲。现在好了,官方有了自动安装包
mingw-get-inst-20110530.exe
下载页面:
http://sourceforge.net/projects/mingw/files/Automated MinGW Installer/mingw-get-inst/
双击安装即可,但是最好不要尝试修改默认的C:\MinGW路径,否则问题就如同滔滔江水,滚滚而来。

装完后需要添加系统环境变量:
我的电脑->右键属性->系统详细设定->详细设定标签页->环境变量,在弹出的对话框里,往Path里加一行”C:\MinGW\bin”即可,跟原本Path的分隔符用;
新版本的msys会自动加载一些环境信息,不用再手动设置。
在操作系统环境变量中定义 MINGW_HOME 和 MSYS_HOME 这两个变量,分别指向 MinGW 和 MSYS的安装目录;
在我的机器上,它们是 C:\MinGW 和 C:\MinGW\msys\1.0;

之后双击msys.bat,即可运行MSYS环境了。

配置MinGW

官方包管理的命令是mingw-get,使用上很类似apt-get,也是install/remove/update/upgrade
不过值得注意的一点是mingw-get upgrade后面必须跟包名称,但可以是”虚包”

如果想查看所有包

mingw-get list #全部信息,很长
mingw-get list | grep package #只是包名

如果想升级所有已安装的包

#只需升级这两个虚包
mingw-get upgrade msys
mingw-get upgrade mingw32

接下来是配置用例,首先刷新一下源

mingw-get update

然后抓一些有用的包

mingw-get install zlib
mingw-get install libz
mingw-get install bzip2
mingw-get install libbz2

配置console环境,我比较喜欢mintty,rxvt的话类似

mingw-get install msys-mintty
# mingw-get install msys-rxvt

用的时候在msys.bat后面加上对应参数即可
创建一个快捷方式->右键属性->在链接目标那一行修改一下参数

msys.bat -mintty
# msys.bat -rxvt

双击创建的快捷方式进入mintty界面,去左上角options菜单配置界面
我的风格:前景色Navy,背景色LightYellow,字体consolas,大小10

目前还没有找到一个unicode的本地语言处理方案,以下均使用ANSI:

确保mintty的locale与Charset为默认
修改~/.minttyrc,删除以下语句

locale=XXX
Charset=XXX

编辑~/.inputrc 文件,修改以下几行并重启msys即可正常输入非英文字符了。

set meta-flag on 
set input-meta on
set output-meta on
set convert-meta off

编辑 /etc/profile 文件,增加一行让ls命令可以正常显示非英文字符。

alias ls="ls --color=tty --show-control-chars"

试用MinGW

以下以gettext为实例演示编译
我想很多人跟我一样是从poedit里面提取msgfmt的,gettext版本是0.17,
其实很多库都有新版,这里介绍如何自编译一个最新的gettext(实际使用0.18.1.1)。

首先需要两个包是libiconv与expat,到GNU官网确认下版本,
libiconv-1.13.1.tar.gz
expat-2.0.1.tar.gz
最新版和mingw提供的一致,然后便可以

mingw-get install libiconv
mingw-get install expat

windows下抓好gettext-0.18.1.1.tar.gz,解压到本地目录../home/gettext-0.18.1.1

在MSYS里进入目录,然后开始编译

./configure --enable-threads=win32
# Mingw的线程管理方式只支持win32,而默认是posix,必须改掉!!
make
make install

是不是和linux下感觉一样?