[原创] 在Windows X64系统制作跨平台Lazarus开发环境

作者:许自强,版权所有,许可转载,请保留作者信息
操作系统:Windows 7 64位专业版

第一部分:准备mingw32 binutils跨平台编译工具
01、安装Fedora Workstation 64位版,建议使用虚拟机

02、安装完成后以root用户登录,下载binutils源代码和mkbinutils
binutils是mingw32项目中的跨平台编译工具,我使用的是 binutils-2.25.1版本
mkbinutils是freepascal项目中为编译binutils而制作的脚本, 在这里下载
将mkbinutils设置为允许运行: chmod +x mkbinutils
注意: binutils源代码和mkbinutils脚本需要放在同一目录,然后将binutils源代码解压

03、以root用户登录,并在Fedora系统中安装需要的库
yum install gcc
yum install mingw32-binutils mingw32-gcc mingw32-gmp mingw32-mpfr
yum install mingw64-binutils mingw64-gcc mingw64-gmp mingw64-mpfr
上面是安装32位版和64位版的mingw库

04、为编译创建需要的文件符号
ln -s /usr/bin/i686-w64-mingw32-ar /usr/bin/i386-pc-mingw32-ar
ln -s /usr/bin/x86_64-w64-mingw32-ar /usr/bin/x86_64-pc-mingw32-ar

05、修改mkbinutils脚本,更改以下几行,如果freepascal修改了mkbinutils脚本,则行号可能不准确
第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版本,请不吝指点

06、执行mkbinutils脚本,等待编译完成

07、修改mkbinutils脚本,更改以下几行(为了编译64位版)
第8行, 改为:CC="x86_64-w64-mingw32-gcc"
第23行,改为:TARGETS="x86_64-linux"
第48行,更改host参数为: --host=x86_64-pc-mingw32

08、执行mkbinutils脚本,等待编译完成

待编译完成后,在/tmp/目录下找到以binutils开头的文件夹,就是已经编译完成的交叉编译工具,将它们复制出来备用

第二部分:获取lazarus和fpc的源代码并进行交叉编译
01、下载lazarus和fpc的源代码,因为当前的正式版2.6.x无法编译成功,
因此使用主干上的源代码进行编译,当前的revision分别是50550和32557
svn co -r 50550  http://svn.freepascal.org/svn/lazarus/trunk/ c:\lazsvn_50550
svn co -r 32557  http://svn.freepascal.org/svn/fpc/trunk/ c:\fpcsvn_32557
如果下载中途断线,可以通过svn update -r 来继续下载 

02、导出lazarus和fpc源代码的非受管版本,用于编译
svn export c:\lazsvn_50550 c:\lazarus
svn export c:\fpcsvn_32557 c:\lazarus\fpc

03、下载并安装fpc 3.0.0-i386-win32作为编译fpc的工具,安装位置c:\fpc\3.0.0

04、建立交叉编译工具及库目录,拷贝交叉编译工具到相应的目录
mkdir c:\lazarus\cross\bin\i386-linux
mkdir c:\lazarus\cross\lib\i386-linux
mkdir c:\lazarus\cross\bin\x86_64-linux
mkdir c:\lazarus\cross\lib\x86_64-linux
将前面编译的交叉编译工具复制到与平台对应的目录下, 注意只需要其中的exe文件,不要其中的目录结构
比如,复制后应该是c:\lazarus\cross\bin\i386-linux\<*.exe files>
另外,lib目录是准备用来放置linux库文件的,现在先空着

05、对fpc进行标准编译及安装(i386-win32)
C:\>cd \lazarus\fpc
C:\lazarus\fpc>\fpc\3.0.0\bin\i386-win32\make.exe clean all install INSTALL_PREFIX=c:\lazarus\fpc

06、对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,我不知道如何获得这个文件,而且我对其它平台一无所知,没有深究。

07、生成fpc.cfg并增加配置内容,这一步非常重要,因为接下来编译lazarus需要使用已经编译好的fpc来进行
C:\lazarus\fpc>cd bin\i386-win32
C:\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

08、因为编译后的fpc比安装的稳定版fpc少几个文件,从稳定版fpc中复制缺少的文件,我不清楚这些文件的用途,仅为有备无患
C:\lazarus\fpc\bin\i386-win32>cd \fpc\3.0.0\bin\i386-win32
C:\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

09、从系统中卸载已安装的fpc 3.0.0,因为接下来需要使用刚才编译的fpc来进行
我在编译过程中发现,如果不卸载掉已安装的fpc,编译过程总是去使用安装的fpc,这会导致编译失败

10、对lazarus做标准编译(i386-win32)
C:\fpc\3.0.0\bin\i386-win32>cd \lazarus
C:\lazarus>fpc\bin\i386-win32\make.exe clean all

11、对lazarus做交叉编译,这一步同样需要根据目标平台个数多次运行, 这一步需要32位版的linux系统,如果没有就安装一个
首先编译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"

  1. linux系统需要安装gcc软件包才能找到这些文件,可以通过whereis和find命令来查找文件位置,大部分文件都位于/usr/lib(或lib64)目录下
  2. 如果在编译过程出现提示信息warning: need by ...,需要的文件就是指示的文件名
  3. 如果在编译过程出现提示信息cannot find -l,需要的文件是lib.so
  4. 有些提示的文件在与目标平台文件名可能有尾缀上的差别,比如提示cannot find -lglib-2.0,我的系统中只有文件libglib-2.0.so.0,将这个文件复制出来并改名
  5. 有些文件在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 ) )
  6. 我在编译过程中先编译了32位linux,然后编译64位linux时只需要几个很少的库就编译完了,但是最后真正编译项目时还是提示缺少库文件,所以,还是按照32位linux的文件清单照样复制一份比较省事
12、为lazarus指定配置文件路径
C:\lazarus>echo --primary-config-path=c:\lazarus\config_lazarus > lazarus.cfg

13、启动lazarus,会提示一个错误,然后有一个配置对话框
设定Compiler为:$(LazarusDir)\fpc\bin\i386-win32\fpc.exe
设定FPC sources为:$(LazarusDir)\fpc

14、新建Application,在Project Options中设置Target OS和Target CPU family,现在可以愉快的开始跨平台编译了

15、我写了一个极简单的应用,只包含一个主窗口和一个按钮,点击按钮弹出一条消息,编译之后在各个平台测试,可以如预期的一样顺利运行
提示:32位的linux应用在64位系统中运行需要安装一些支持库,这不是lazarus的问题,我没有测试具体需要什么支持库

16、终于,可以算得上是大功告成,自己庆贺一下,呵呵呵,哈哈哈,:)

参考资料:
http://www.stack.nl/~marcov/buildfaq.pdf
http://wiki.lazarus.freepascal.org/fpcup

下面是我已编译好的跨平台编译工具以及从linux系统中复制出来的库文件,也许能对部分朋友有点帮助,或者做为参考
http://yunpan.cn/c3QQhpSnmAEvR  访问密码 a469 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/634491/viewspace-1851783/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/634491/viewspace-1851783/

你可能感兴趣的:([原创] 在Windows X64系统制作跨平台Lazarus开发环境)