在linux下使用MingW交叉编译win32应用

之前只用过free pascal的编译器做过类似的事情,没想到MingW移植的gcc也移植回了linux。

 

以arch为例,安装好mingw-w64这个软件包之后,在/usr/i686-w64-mingw32下就形成了一个基本的交叉编译环境,windows的基本头文件和基本库都在,而交叉编译器位于/usr/bin,叫i686-w64-mingw32-xxx,例如i686-w64-mingw32-gcc。

i686-w64-mingw32这个名称取决于你的发行版的mingw的打包者,在下文,我们会尝试编译几个支持交叉编译的软件包,它们使用的autoconf系统的--host参数,就需要指定这个名称;这样autoconf就能知道如何正确地设置CC、CFLAGS中的默认-I头文件位置、LIBS中的默认-L库位置,生成使用MingW交叉编译环境的Makefile。

事实上同时还安装了x86_64-w64-mingw32这个--host,对应64位的windows程序的交叉编译环境。

 

以编译libXau-1.0.8.tar.bz2为例。

它提供了X的验证功能,依赖于xproto软件包。xproto就是一系列规定X协议的头文件,大部分发行版都装了它,但是在/usr/i686-w64-mingw32/include下显然不会有这些文件。

我们可以用root把xproto的头文件复制到这个系统位置,不过博主不会用这么barbarian的方法,我们单独创建一个目录,例如/mnt/data/cross-build/,然后把xproto复制到/mnt/data/cross-build/usr/local/include/X11。

接下来运行CFLAGS="-I/mnt/data/cross-build/usr/local/include" ./configure --host=i686-w64-mingw32,就出来了使用交叉编译环境的Makefile,直接make就出来了。

然后make install DESTDIR=/mnt/data/cross-build/,就会安装到我们刚创建的位置,这样接下来交叉编译别的依赖libXau的autoconf的软件包,就可以如法炮制,即再./configure之前定义这两个环境变量:CFLAGS="-I/mnt/data/cross-build/usr/local/include" LIBS="-L/mnt/data/cross-build/usr/local/lib"。

 

有的软件包对于交叉编译的测试不充分,例如编译libxcb-1.11的时候,就会因为链接不上windows的socket库(对于windows来说是ws2_32.lib和对应的dll,MingW提供的是libws2_32.a),这样可以在LIBS变量中自己手动再加上"-lws2_32"之类的参数。

你可能感兴趣的:(linux)