2011-01-09 94 views
5

我是delphi的新手。我试图在我的Delphi项目中添加C Object文件并直接链接它们,因为Delphi支持C Object Linking。当我链接单个对象文件时,我得到了它的工作。但是当我尝试链接多个对象文件时,出现'不满意的前向或外部声明'错误。我曾在Delphi 2007以及XE中试过这个。那么我在这里做错了什么?在Delphi 2007中链接多个C对象文件时出错

工作代码:

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. 
+0

我的猜测:在三个目标文件中找不到“b_function()”或“c_function()”。您认为该问题与链接多个对象文件有关,并且您证明您可以链接一个文件。您是否尝试过链接,例如,只有“b.obj”和只导入“b_function()”? – 2011-01-09 07:57:16

+0

也许这篇文章由鲁迪Velthuis可以帮助: http://rvelthuis.de/articles/articles-cobjs.html – vcldeveloper 2011-01-09 08:06:24

回答

7

另外,由@vcldeveloper链接的文章对一些常见问题有很好的解释。在Pascal代码中提供缺少的C RTL函数的技巧比试图链接必要的C文件或甚至作为.obj文件更好。

但是,我有一个怀疑,我知道这里发生了什么。我使用这种方法,但实际上在单元中有超过100个.obj文件。我发现当我添加新的时候,我会得到和你一样的链接器错误。我解决这个问题的方法是尝试重新排序我的$ LINK指令。我尝试逐个添加新的obj文件,并且最终我一直能够解决此问题。

如果你的C文件是完全独立的,那么你可以把每一个放在一个不同的单元中,链接器会处理它。但是,我怀疑是这样,我怀疑如果他们真的是独立的,那么这个问题就不会发生。另外,希望在一个单元中包含$ LINK指令,以便任何需要提供的RTL函数只能提供一次(它们需要与$ LINK指令出现在同一单元中)。

这古怪的连接存在于德尔福6和存在于德尔福2010年

编辑1:实现现在我明白了这个问题,可能是由于采用Delphi单程编译器。我怀疑“缺少外部引用”错误是因为编译器按照它们出现在单元中的顺序处理.obj文件。

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

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

编辑2:我发现了另一个堆栈溢出问题,涵盖这一理由: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; 

如果您希望从德尔福打电话,那么你的程序显然需要获取参数列表,调用约定等。否则,如果它是外部代码的内部例程,则可以忽略参数列表,调用约定等。

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

我现在已经能够添加更多的工具到我的军械库 - 感谢您提出这个问题!

0

你的语法是好的,但像科斯明说,这是可能的,什么是错与b.objc.objb_functionc_function

尝试先单独链接它们,或编辑您的帖子以显示实际的代码和链接器输出消息(如果可能)。