链接顺序

从2.0.4开始,添加了一些开关,以简化处理库名称的更改。这些开关是测试版,可能在任何时候改变或消失,例如,当一个链接描述语言被实现。它们大部分被添加,以便能够清楚地了解系统在实践中的可用性,主要是为了处理库名的变化并保持一个版本运行而不需要在做出最终决定之前重新打包它。它们也是测试版的,因为内部链接器可能在不久的将来完全改变后端链接方式。

它解决的主要问题是,使用 FPC,库的名称可以在 $linklib 或 EXTERNAL 声明的 FPC 源中进行硬编码。这通常是一件好事,它使用户更容易,并且避免像在 gcc 那样必须在命令行上指定每个库的麻烦,并且使用的是重命名库的发行版时,这可能会很烦人。

除了名称之外,库的顺序有时也可能是一个问题,特别是当库没有正确指定它们的依赖性时。大多数这些问题都与 libgcc 等相对较低级别的库有关。

FPC 2.0.4 引入了几个测试用开关来解决这个问题。有三个新参数:

  1. -XLAlibname=[库名1][,库名2]

  2. -XLOlibname=<数字>

  3. -XLD

-XLA

剩下的限制是没有办法允许用户确定哪些库是静态链接的,哪些是动态链接的。这主要是为了更容易在 linux 上部署(非标准库?-> 强制静态)。最近出现的另一个限制是,这只适用于库。对象文件及其顺序未受影响。

第1个参数 -XLA 定义了待替换的库名,如果这个库名在左侧列表中,并且链接库是从源构建的,则右侧的库将添加到链接器参数中。右侧可以为空,也可以包含左侧的指定库名。如:

  1. -XLAc=c,dl 确保如果 libc 在列表中,则会添加 libdl,libc 仍保留在列表中。

  2. -XLAdl= 将 libdl 从库列表中删除,即使它是源代码中的 {$linklib xx}。

  3. -XLAgtk-12=gtk12 转换到 libgtk12 的链接以搜索 libgtk-12。

-XLO

XLO 参数定义了一个权重。库按权重降序排序,默认权重为 1000。如果权重减少,它将链接库列表中处于较低的权重。这主要用于按一定顺序链接某些库(通常是较低级别的库),例如:在 FreeBSD4 上使用 libc_r 和 libc库,或者让程序链接,这使得它们依赖性变得混乱。这种可能性消除了对一些临时技巧的需要,以及 FreeBSD 4->5 转换的特殊参数,就是这样一个组合,-Xf 重新实现了该功能,编译器对每个目录都有默认权重,这意味着 libc 通常会在接近结束的地方。

像:

-XLOc=1050

将 libc 放在 没有 link.res 指定权重的库之前(因为默认值为 1000)。

-XLD

-XLD 参数只会使编译器忽略权重和别名的默认值。如果具有硬编码权重的库发生变更,或者不再需要内置别名,则此功能非常有用。

示例:使用链接顺序修复 FreeBSD GTK 损坏

FreeBSD 端口维护人员决定在2005年11月强制对端口树中与使用 libtool 链接相关的做重大更改(更新中)。但是直到2006年4月他们才开始进行。这些变化的副作用之一是将 GTK 1的库重命名为 gtk-12,gdk-12 和 glib-12,它们以前是 gtk12,gdk12 和 glib12。

这些更改对 5、6版本的用户产生了影响,因为他们没有等到主要的版本转换来引入这个。端口维护者也拒绝添加一些符号链接以临时过渡,并指定 gcc 特定工具,如 gtkcon g 和 libtool(这些发出 gcc 命令行)。

大多数用户出于实用目的,默认情况下跟踪稳定版,将 FPC 可执行文件更改为调用外部程序并解析它们,只会使得整个过程更加脆弱和难以支持。我自己决定放弃对 FPC 端口树条目的研究,因为,我想知道我参与其中得到了什么好处,这项工作巨大,而用户使用的也很少,并且这些变化如此困难且会频繁的破坏包。

随着是时间的推移,越来越多的用户将在更改后使用稳定版或基于稳定版本,因此在 FPC 2.2.0 中,我将 GTK 库的默认名称更改为它们的新名称,并且引入了链接顺序开关,来保持旧安装的正常工作,因此,如果你在更改前有一个系统,并且使用了不稳定的版本,则可以通过在 fpc.cfg 或 .fpc.cfg设置以下内容来解决此问题:

-XLAglib-12=glib12
-XLAgdk-12=gdk12
-XLAgtk-12=gtk12

示例2:FreeBSD 4 vs 5 pthreads:-Xf

另一项是 ppc<x>,参数 -Xf,表示另一个 pthreads 布局。目前它仅适用于 FreeBSD。在 2.0 和 2.0.2 上,该参数表示 FreeBSD 5.x libpthread 行为,在 2.0.4 上,它表示 4.x libc_r 行为。在 2.0.4 中,参数在链接顺序上重新实现,这样当编译 4.x 时可以使用 libc_r 1,在 FreeBSD 5.x 上编译时 libpthread 将链接到。此外,使用 -XLO 使用与内部等效项对 xed 的排序,-XLD 可以覆盖默认值。

1

2.0.4 不再提供开箱即用的 4.x 设置,通常应该保留功能。