.. index:: single: 交叉编译 Lazarus 交叉编译 Lazarus ------------------------ 在 Windows 上交叉编译 Lazarus 到 Linux ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 首先,我们需要一套交叉编译工具 binutils。Windows -> 其它平台,它在 FPC 上 ftp://ftp.freepascal.org/fpc/contrib/cross/mingw/binutils-2.15-win32-i386-linux.zip [#CROSSCOMPILINGSNAPSHOT1]_。下载并提取压缩包文件到 ppc386 程序相同目录。通过在命令行中执行 i386-linux-ld 来验证安装。 其次,我们需要 FPC 和 Lazarus 源。请注意,FPC 源必须是导出的,因为我们将使用 make install,并在 SVN 目录上进行安装,所以检出后再导出 SVN 源。(参见 SVN章节示例) 现在我们将构建并安装 FPC 以进行交叉编译(假设 FPC 安装在 c:\fpc\2.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:\fpc\2.0.4\units\i386-linux\rtl)并复制 cprt21.o 和 cprt0.o,这2个文件实际上都是 cprt21.o。 现在我们从 Lazarus 构建开始,进行 Lazarus 目录,并执行: .. code-block:: bash :linenos: 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) [#CROSSCOMPILINGSNAPSHOT2]_。 它应该构建一个 Linux Lazarus。但最有可能摧毁一些库。解决方案是编辑链接器 link.res,并再次运行 ppas.sh,或者,重命名库来调整 d:\fpc\linuxlib 目录。链接别名选项(如上面的 -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/,这是我要复制的文件: .. code-block:: bash :linenos: 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 也是这样。相关的信息,参见单独段落。 .. [#CROSSCOMPILINGSNAPSHOT1] 译者注:原地址在,ftp://freepascal.stack.nl/pub/fpc/contrib/cross/mingw/binutils-2.15-win32-i386-linux.zip,这是个镜像地址,新的地址是官方 FPC 站点的地址。 .. [#CROSSCOMPILINGSNAPSHOT2] 或者,你可以把 {$linklib dl} 和 {$linklib gmodule} 添加到 lazarus 主文件 lazarus.pp 中。