Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 为什么带有$L指令的链接对象文件的顺序很重要?_Delphi_Linker_External - Fatal编程技术网

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

Delphi 为什么带有$L指令的链接对象文件的顺序很重要?,delphi,linker,external,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

我使用静态链接的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文件的交叉使用有关,但如果我了解发生了什么,我会感到更安全

谢谢

编辑:

在通过链接到另一个的注释中,我将
链接器
替换为
编译器
,并在下面的斜体部分添加了一个注释:

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

由于Delphi链接器编译器针对的是Delphi语言,而Delphi语言不允许这样做,因此链接器编译器也不允许这样做

赞成:链接器编译器要快得多

缺点:您需要通过按正确的顺序放置.obj文件来帮助链接器编译器
,或通过手动解析依赖项(请参见上述内容)


--杰罗恩

什么的3_6_10和3_6_12版?我不知道任何类似的Delphi版本。对不起,是关于sqlite版本的,只是提供了更多关于ojbect文件的详细信息used@Jeroen:您知道使用obj文件的Delphi的哪个版本?:-)很明显,这是他的sqlite库的版本。我错过了什么吗?Obj文件链接在Delphi中已经存在很多年了,不是吗?)@Marjan:对不起,我完全错过了sqllite部分。所以从你所说的,我得出结论,如果引用是循环的,那么可能会出现Delphi 1-pass链接器无法链接的情况?@Maksee:我认为这确实是可能的。我不确定Borland C++链接器是否以任何方式围绕这个问题运行。@ Jeroen,因为C++链接器链接C++,它肯定需要处理循环引用吗?@ Jeroen,我想你的答案应该是引用编译器而不是链接器。当然,编译器是单通道的。链接器必须是多通道的。连接对象并构建贴图的第一步。第二次通过修正所有函数地址。@David:我想修正是在链接时间完成的。巴里·凯利或丹尼·索普将是这个问题的最终答案:——)