如何在Linux平台上使用Delphi链接目标文件?

3
我在Linux平台上使用对象文件,并按照下面的代码链接它们到我的Delphi应用程序中,但是出现了以下错误:

"E2065 Unsatisfied forward or external declaration: 'add'"

Delphi:

    program ITP_Test;
    
    {$APPTYPE CONSOLE}
    
    {$R *.res}
    
    uses
      System.SysUtils;
    
    {$LINK 'hello.o'}
    
    function add(a ,b : Integer): Integer; cdecl; external;
    
    begin
      Writeln(add(2,7));
    end.

hello.c
    
    #include<stdio.h>
    #ifdef __cplusplus
    extern "C"
    {
    #endif
    int add(int a, int b)
    {
        return a + b;
    }
    #ifdef __cplusplus
    }
    #endif

使用命令“gcc -c hello.c”编译hello.c文件。

gcc版本:7.5.0 Linux版本:Ubuntu 18.04


可能是C代码编译时符号装饰的问题? - undefined
你不想使用 pascal 调用约定,而是应该使用 cdecl。在这里,基本的调试步骤是停止尝试编译最终产品,回到你可以尝试的最简单的东西。你能否创建一个程序,链接一个只包含以下函数的对象 int add(int a, int b) { return a + b; } - undefined
@DavidHeffernan 我尝试了一个简单的程序,但出现了“E2065 无法满足前向或外部声明:'add'”的错误。 - undefined
1
所以问题不在于多个目标文件。如果您能编辑它,使其具有我提供的非常简单的功能,并且完全可复制,那将是很好的。因此,请提供操作系统版本、编译器版本、编译器命令行等详细信息。 - undefined
@DavidHeffernan,正如你建议的那样,我编辑了问题并提供了详细信息。请问你能否提出解决这个问题的建议? - undefined
显示剩余7条评论
1个回答

2

我在Delphi文档中找到了解决方案。

您的示例语法为:

function add(a, b : Integer): Integer; cdecl; external object 'hello.o' name 'add';

不需要使用$LINK编译指令。

因此,您示例的完整代码如下:

program LinuxExternalHello;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

function add(a, b : Integer): Integer; cdecl; external object 'hello.o' name 'add';

begin
  Writeln(add(2,7));
end.

你好.c文件和编译方法完全正确。Marion Candau在他的YouTube视频中描述的替代方法仍然有效,但需要多一个步骤来构建归档文件。

谢谢 @fpiette,是的,即使这个解决方案也有效 :) 是的,这样可以避免链接和创建存档文件的步骤。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接