交叉编译 Lazarus¶
在 Windows 上交叉编译 Lazarus 到 Linux¶
首先,我们需要一套交叉编译工具 binutils。Windows -> 其它平台,它在 FPC 上 ftp://ftp.freepascal.org/fpc/contrib/cross/mingw/binutils-2.15-win32-i386-linux.zip 1。下载并提取压缩包文件到 ppc386 程序相同目录。通过在命令行中执行 i386-linux-ld 来验证安装。
其次,我们需要 FPC 和 Lazarus 源。请注意,FPC 源必须是导出的,因为我们将使用 make install,并在 SVN 目录上进行安装,所以检出后再导出 SVN 源。(参见 SVN章节示例)
现在我们将构建并安装 FPC 以进行交叉编译(假设 FPC 安装在 c:fpc2.4.0):
make clean make OS_TARGET=linux all make OS_TARGET=linux install INSTALL_PREFIX=c:\fpc\2.4.0
然而,Lazarus 是不同的处理方式,因为它使用了共享库。所以,我从目录系统复制了 Linux 库并放在了 d:linuxlib 中。我复制的库会在下面的单独段落中介绍。
在真正开始之前,我们必须解决一个问题,编译器仍然检测到 pre-glibc 系统,如果你犯了错误,它很容易退出。所以进入 i386-linux rtl 目录(可能在 c:fpc2.0.4unitsi386-linuxrtl)并复制 cprt21.o 和 cprt0.o,这2个文件实际上都是 cprt21.o。
现在我们从 Lazarus 构建开始,进行 Lazarus 目录,并执行:
1 2 | rem 在一行上
make OS_TARGET=linux all OPT= -gl -Fld:\fpc\linuxlib -Xr/usr/lib -FL/usr/lib/ld-linux.so.2 -XLAc=c,dl,gmodule
|
-gl 是添加调试信息(如果出现问题,可以很好的追溯),Fl 参数是指定查找 Linux 库的目录,-Xr 参数使用链接器创建可执行文件,以便在 /usr/lib 中搜索库。-FL 参数是动态链接器的名称,如果包含 -XLA,则会添加2个库(dl 和 gmodule) 2。
它应该构建一个 Linux Lazarus。但最有可能摧毁一些库。解决方案是编辑链接器 link.res,并再次运行 ppas.sh,或者,重命名库来调整 d:fpclinuxlib 目录。链接别名选项(如上面的 -XLA )可以避免重复编辑。
准备使用 Linux 库目录¶
对于交叉编辑,我复制了一堆目标 Linux 发行版的文件(是的,它与某发行版及版本有关!)文本模式 IDE 也需要一些,如果库名在 Linux 名为 libname.so.x.y,我们在 Windows 目录中将它们重命名为 libname.so,因为 Linux 上的符号链接文件不容易被复制。
大多数库都在 /lib、/usr/lib 也可能在 /usr/local/lib 、/usr/X11R6/lib 和 /opt/gnome/lib 目录,然而,libgcc 在 GCC 的安装目录中,可以通过执行 gcc -v 找到,然后查看相关的行。
像 /usr/lib/gcc-lib/i486-linux/3.3.5/specs,
另外,还有一些库在 /usr/lib/gcc-lib/i486-linux/3.3.5/,这是我要复制的文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | libpthread.so.0
libdl.so
libc.so
ld-linux.so.2
crtbegin.o
crtbeginS.o
crtbeginT.o
crtend.o
crtendS.o
crtn.o
crti.o
libgcc.a
libX11.so
libXi.so
libglib-1.2.so
libgmodule-1.2.so.0
libgdk_pixbuf.so
libgdk-1.2.so
libgtk-1.2.so
libXext.so
libm.so
libdl.so.2
libgmodule-1.2.so
|
注意,某些目录是重复,带有后缀(如 libgmodule-1.2.0),我需要使用它们2次,因为,其它的库名对它有依赖(像 lib<名称>.so.x),我们不能在 Windows 上进行符号链接,因此,我要复制它。
通过重命名以避免错误,是不错的方案。确保所有 crt* 和 libc.so 可用,以避免生成 link.res 时报错。在我的情况下,步骤11编译将正常,但链接器提示在目标系统上找不到 libgt.so,libgtk 是 gtk 2.0,而我们要 Lazarus(<=0.9.26)gtk 1.2,名字是 libgtk-1.2。使用 -XLAgtk=gtk-1.2 来解决这个问题,对于 gdk 和 glib 也是这样。相关的信息,参见单独段落。
- 1
译者注:原地址在,ftp://freepascal.stack.nl/pub/fpc/contrib/cross/mingw/binutils-2.15-win32-i386-linux.zip,这是个镜像地址,新的地址是官方 FPC 站点的地址。
- 2
或者,你可以把 {$linklib dl} 和 {$linklib gmodule} 添加到 lazarus 主文件 lazarus.pp 中。