加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Delphi 2007中链接多个C对象文件时出错

发布时间:2020-12-15 09:31:00 所属栏目:大数据 来源:网络整理
导读:我是delphi的新手.我试图在我的Delphi项目中添加C Object文件并直接链接它们,因为Delphi支持C Object Linking.当我链接单个Object文件时,我得到了它.但是当我尝试链接多个目标文件时,我收到错误“不满意的前向或外部声明”.我在Delphi 2007以及XE中尝试过这
我是delphi的新手.我试图在我的Delphi项目中添加C Object文件并直接链接它们,因为Delphi支持C Object Linking.当我链接单个Object文件时,我得到了它.但是当我尝试链接多个目标文件时,我收到错误“不满意的前向或外部声明”.我在Delphi 2007以及XE中尝试过这个.所以我在这里做错了什么?

工作守则:

function a_function():Integer;cdecl;  

implementation  

{$Link 'a.obj'}  

function a_function():Integer;cdecl;external;  

end.

错误代码:

function a_function():Integer;cdecl;  
function b_function();Integer;cdecl;  
function c_function();Integer;cdecl;  

implementation  

 {$LINK 'a.obj'}  
 {$LINK 'b.obj'}  
 {$LINK 'c.obj'}  

function a_function():Integer;cdecl;external;  
function b_function();Integer;cdecl;external;  
function c_function();Integer;cdecl;external;  
end.

解决方法

另外,由@vcldeveloper链接的文章对一些常见问题有很好的解释.在Pascal代码中提供缺少的C RTL函数的技巧非常好,并且比尝试将必要的函数链接为C文件甚至是.obj文件要快得多.

但是,我怀疑我知道这里发生了什么.我使用相同的方法,但实际上在单元中有超过100个.obj文件.我发现当我添加新的时,我会得到与您相同的链接器错误.我解决这个问题的方法是尝试重新订购我的$LINK指令.我尝试逐个添加新的obj文件,最终我总能解决这个问题.

如果您的C文件完全是独立的,那么您可以将每个文件放在不同的单元中,链接器将处理它.但是,我怀疑是这样,事实上我怀疑,如果它们真的是独立的,那么这个问题就不会发生了.此外,最好将$LINK指令放在一个单元中,这样任何需要提供的RTL功能都只能提供一次和一次(它们需要与$LINK指令出现在同一个单元中).

链接器中的这种奇怪现象存在于Delphi 6中,并且存在于Delphi 2010中.

编辑1:现在已经意识到这个问题可能是由于Delphi使用单通道编译器.我怀疑“缺少外部引用”错误是因为编译器按照它们出现在单元中的顺序处理.obj文件.

假设a.obj出现在b.obj之前,而a.obj则调用b()b.obj中的函数.编译器不知道b()驻留在需要修复函数调用的位置.当我找到时间时,我会尝试测试这个假设是否至少是合理的!

最后,解决问题的另一个简单方法是将a.c,b.c和c.c组合成一个单独的C文件,我相信它会绕过OP的这个问题.

编辑2:我发现另一个Stack Overflow问题涵盖了这个基础:stackoverflow.com/questions/3228127/why-does-the-order-of-linked-object-file-with-l-directive-matter

编辑3:我找到了解决这个问题的另一种真正好方法.每次编译器抱怨

[DCC Error] Unit1.pas(1): E2065 Unsatisfied forward or external declaration: '_a'

你只需在单元的实现部分添加一个如下声明:

procedure _a; external;

如果它是您希望从Delphi调用的例程,那么您显然需要获取参数列表,调用约定等.否则,如果它是外部代码的内部例程,那么您可以忽略参数列表,调用约定等.

据我所知,这是导入两个以循环方式相互引用的对象的唯一方法.我认为以这种方式宣布外部程序类似于做出前瞻性声明.不同之处在于实现是由对象而不是Pascal代码提供的.

我现在能够为我的军械库添加更多工具 – 谢谢你提出这个问题!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读