我使用静态链接的 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 文件的交叉使用有关,但如果我了解发生了什么,我会感到更安全
Thanks
Edit:
截至评论大卫赫夫南 https://stackoverflow.com/users/505088/david-heffernan链接到他的回答 https://stackoverflow.com/questions/4638186/error-while-linking-multiple-c-object-files-in-delphi-2007/4638633#4638633到这个另一个关于在Delphi中链接.obj文件的问题 https://stackoverflow.com/questions/4638186/error-while-linking-multiple-c-object-files-in-delphi-2007,我替换了linker
by compiler
,并添加了一个italic以下部分:
C 编译器使用多遍链接器编译器,它知道如何解决 .obj 文件之间的前向和循环依赖关系。
由于Delphi linker编译器是针对Delphi语言的,而Delphi语言不允许这样做,所以linker编译器也不允许这样做。
优点:linker 编译器速度更快。
缺点:您需要通过按正确的顺序放置 .obj 文件来帮助 linker 编译器
,或者通过手动解决依赖关系(参见上面提到的大卫·赫弗南的回答 https://stackoverflow.com/questions/4638186/error-while-linking-multiple-c-object-files-in-delphi-2007/4638633#4638633)
.
--jeroen
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)