binutils是mingw32项目中的跨平台编译工具,我使用的是 binutils-2.25.1版本mkbinutils是freepascal项目中为编译binutils而制作的脚本, 在这里下载将mkbinutils设置为允许运行: chmod +x mkbinutils注意: binutils源代码和mkbinutils脚本需要放在同一目录,然后将binutils源代码解压
yum install gccyum install mingw32-binutils mingw32-gcc mingw32-gmp mingw32-mpfryum install mingw64-binutils mingw64-gcc mingw64-gmp mingw64-mpfr上面是安装32位版和64位版的mingw库
ln -s /usr/bin/i686-w64-mingw32-ar /usr/bin/i386-pc-mingw32-arln -s /usr/bin/x86_64-w64-mingw32-ar /usr/bin/x86_64-pc-mingw32-ar
第6行, 改为:VER="2.25.1"第8行, 改为:CC="i686-w64-mingw32-gcc"第23-26行,改为:TARGETS="i386-linux"备注: 此处可以编译其它平台版本,但我只需要linux版本。另外经测试,在第二部分中编译darwin(即MacOS)版需要i386-darwin-clang.exe文件,我不知道如何获得这个文件,我对MacOS一无所知且时间有限,没有继续深究,如果有哪位朋友知道如何编译darwin版本,请不吝指点
第8行, 改为:CC="x86_64-w64-mingw32-gcc"第23行,改为:TARGETS="x86_64-linux"第48行,更改host参数为: --host=x86_64-pc-mingw32
因此使用主干上的源代码进行编译,当前的revision分别是50550和32557svn co -r 50550 http://svn.freepascal.org/svn/lazarus/trunk/ c:\lazsvn_50550svn co -r 32557 http://svn.freepascal.org/svn/fpc/trunk/ c:\fpcsvn_32557如果下载中途断线,可以通过svn update -r 来继续下载
svn export c:\lazsvn_50550 c:\lazarussvn export c:\fpcsvn_32557 c:\lazarus\fpc
mkdir c:\lazarus\cross\bin\i386-linuxmkdir c:\lazarus\cross\lib\i386-linuxmkdir c:\lazarus\cross\bin\x86_64-linuxmkdir c:\lazarus\cross\lib\x86_64-linux将前面编译的交叉编译工具复制到与平台对应的目录下, 注意只需要其中的exe文件,不要其中的目录结构比如,复制后应该是c:\lazarus\cross\bin\i386-linux\<*.exe files>另外,lib目录是准备用来放置linux库文件的,现在先空着
C:\>cd \lazarus\fpcC:\lazarus\fpc>\fpc\3.0.0\bin\i386-win32\make.exe clean all install INSTALL_PREFIX=c:\lazarus\fpc
首先编译x86_64-win64,编译win64不需要特别指定编译工具C:\lazarus\fpc>\fpc\3.0.0\bin\i386-win32\make clean crossall crossinstall OS_TARGET=win64 CPU_TARGET=x86_64 INSTALL_PREFIX=c:\lazarus\fpc
然后编译i386-linux,需要指定编译工具C:\lazarus\fpc>\fpc\3.0.0\bin\i386-win32\make clean crossall crossinstall OS_TARGET=linux CPU_TARGET=i386 CROSSBINDIR=c:\lazarus\cross\bin\i386-linux BINUTILSPREFIX=i386-linux- INSTALL_PREFIX=c:\lazarus\fpc
继续编译x86_64-linux:C:\lazarus\fpc>\fpc\3.0.0\bin\i386-win32\make clean crossall crossinstall OS_TARGET=linux CPU_TARGET=x86_64 CROSSBINDIR=c:\lazarus\cross\bin\x86_64-linux BINUTILSPREFIX=x86_64-linux- INSTALL_PREFIX=c:\lazarus\fpc
我猜测编译其它平台的命令类似,但是编译darwin失败,提示需要i386-darwin-clang.exe,我不知道如何获得这个文件,而且我对其它平台一无所知,没有深究。
C:\lazarus\fpc>cd bin\i386-win32C:\lazarus\fpc\bin\i386-win32>fpcmkcfg.exe -d basepath=c:\lazarus\fpc -o .\fpc.cfg
编辑fpc.cfg并在文件末尾增加以下内容#cross compile settings for linux#ifdef linux#ifdef cpui386-FDC:\lazarus\cross\bin\i386-linux\-XPi386-linux--Tlinux-FlC:\lazarus\cross\lib\i386-linux\-Xr/usr/lib-FLld-linux.so.2#endif#ifdef cpux86_64-FDC:\lazarus\cross\bin\x86_64-linux\-XPx86_64-linux--Tlinux-FlC:\lazarus\cross\lib\x86_64-linux\-Xr/usr/lib64-FLld-linux-x86-64.so.2#endif#endif
C:\lazarus\fpc\bin\i386-win32>cd \fpc\3.0.0\bin\i386-win32C:\fpc\3.0.0\bin\i386-win32>for %1 in (*.*) do if not exist c:\lazarus\fpc\bin\i386-win32\%1 copy %1 c:\lazarus\fpc\bin\i386-win32
我在编译过程中发现,如果不卸载掉已安装的fpc,编译过程总是去使用安装的fpc,这会导致编译失败
C:\fpc\3.0.0\bin\i386-win32>cd \lazarusC:\lazarus>fpc\bin\i386-win32\make.exe clean all
首先编译x86_64-win64,编译win64不需要特别指定编译工具C:\lazarus>fpc\bin\i386-win32\make.exe all OS_TARGET=win64 CPU_TARGET=x86_64
然后编译i386-linux,因为需要的库文件很多,我没办法逐个列举, 需要重复执行这一步骤以得知需要哪些库文件,从32位linux系统中复制到lazarus\cross\lib\i386-linux目录C:\lazarus>fpc\bin\i386-win32\make all OS_TARGET=linux CPU_TARGET=i386 CROSSBINDIR=c:\lazarus\cross\bin\i386-linux BINUTILSPREFIX=i386-linux- LIBDIR=c:\lazarus\cross\lib\i386-linux OPT="-gl -Xr/usr/lib -FL/lib/ld-linux.so.2 -XLAc=c,dl,gmodule"
继续编译x86_64-linux, 需要重复执行这一步骤以得知需要哪些库文件,从64位linux系统中复制到lazarus\cross\lib\x86_64-linux目录C:\lazarus>fpc\bin\i386-win32\make all OS_TARGET=linux CPU_TARGET=x86_64 CROSSBINDIR=c:\lazarus\cross\bin\x86_64-linux BINUTILSPREFIX=x86_64-linux- LIBDIR=c:\lazarus\cross\lib\x86_64-linux OPT="-gl -Xr/usr/lib64 -FL/usr/lib64/ld-linux-x86-64.so.2 -XLAc=c,dl,gmodule"
- linux系统需要安装gcc软件包才能找到这些文件,可以通过whereis和find命令来查找文件位置,大部分文件都位于/usr/lib(或lib64)目录下
- 如果在编译过程出现提示信息warning: need by ...,需要的文件就是指示的文件名
- 如果在编译过程出现提示信息cannot find -l,需要的文件是lib.so
- 有些提示的文件在与目标平台文件名可能有尾缀上的差别,比如提示cannot find -lglib-2.0,我的系统中只有文件libglib-2.0.so.0,将这个文件复制出来并改名
- 有些文件在linux系统中是ld脚本,如果文件非常小,只有几百个字节,则有可能是ld脚本,可以用cat命令(或Windows下的记事本)查看文件内容,将需要的文件一并复制出来,并修改这个ld脚本,将其中的路径去掉,比如:我的系统上复制来的libc.so,它还需要libc.so.6和libc_nonshared.a这两个文件,libc.so中修改之后的部分内容如下
GROUP ( libc.so.6 libc_nonshared.a AS_NEEDED ( ld-linux.so.2 ) )- 我在编译过程中先编译了32位linux,然后编译64位linux时只需要几个很少的库就编译完了,但是最后真正编译项目时还是提示缺少库文件,所以,还是按照32位linux的文件清单照样复制一份比较省事
C:\lazarus>echo --primary-config-path=c:\lazarus\config_lazarus > lazarus.cfg
设定Compiler为:$(LazarusDir)\fpc\bin\i386-win32\fpc.exe设定FPC sources为:$(LazarusDir)\fpc
提示:32位的linux应用在64位系统中运行需要安装一些支持库,这不是lazarus的问题,我没有测试具体需要什么支持库
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/634491/viewspace-1851783/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/634491/viewspace-1851783/