ITPub博客

首页 > 应用开发 > IT综合 > [原创] 在Windows X64系统制作跨平台Lazarus开发环境

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

原创 IT综合 作者:hawkx 时间:2015-12-02 17:49:01 0 删除 编辑
作者:许自强,版权所有,许可转载,请保留作者信息
操作系统: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的文件清单照样复制