交叉编译 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 中。