为什么带有$ L指令的链接对象文件的顺序很重要?

时间:2010-07-12 11:38:48

标签: delphi linker external

我使用静态链接的sqlite数据库,为了编译每个下一个版本,我有时必须对使用的目标文件列表进行微小的更改。 但有时我必须做出的改变让我感到困惑。 例如,在版本3_6_10之前这个订单

{$L 'Objs\is.OBJ'}
{$L 'Objs\mbisspc.OBJ'}

没关系,但是从3_6_12开始链接器说

unsatisfied forward or external declaration _isspace

但将订单更改为

{$L 'Objs\mbisspc.OBJ'}
{$L 'Objs\is.OBJ'}

帮助。 至于sqlite的变化,它确实停止在3_6_12中使用c函数isspace并开始使用内部等效,因此“isspace”关键字甚至不会出现在obj文件中。

那么为什么带有$ L指令的链接对象文件的顺序很重要?我可以在哪里阅读更多相关内容?我想这是与列出的obj文件的交叉使用相关的东西,但如果我理解发生了什么,我会感觉更安全

由于

1 个答案:

答案 0 :(得分:4)

修改

截至David Heffernanhis answer关联question on linking .obj file in Delphi的评论,我将linker替换为compiler,并添加了斜体部分如下:

C编译器使用多遍链接器编译器,该编译器知道如何解决.obj文件之间的正向和循环依赖关系。

由于Delphi 链接器编译器针对Delphi语言,并且Delphi语言不允许这样做,链接器编译器也不允许这样做。< / p>

Pro:链接器编译器要快得多。

Con:你需要通过以正确的顺序放置.obj文件来帮助链接器编译器 ,或通过手动解析依赖项(请参阅上面提到的answer by David Heffernan

- 的Jeroen