delphi - 将 FPC .o 文件链接到 Delphi

标签 delphi freepascal delphi-xe5 fpc

如何将 FPC .o 从库链接到 Delphi 可执行文件。当我尝试链接以下代码时,我收到一堆不满意的前向或外部声明。

library project1;

{$mode objfpc}{$H+}

uses
  Classes
  { you can add units after this };

function Test: Integer;
begin
  Result := -1;
end;

begin
end.


[dcc64 Error] Project2.dpr(170): E2065 Unsatisfied forward or external declaration: 'INIT$_$SYSTEM'
[dcc64 Error] Project2.dpr(170): E2065 Unsatisfied forward or external declaration: 'FINALIZE$_$OBJPAS'
[dcc64 Error] Project2.dpr(170): E2065 Unsatisfied forward or external declaration: 'INIT$_$LNFODWRF'
[dcc64 Error] Project2.dpr(170): E2065 Unsatisfied forward or external declaration: 'FINALIZE$_$LNFODWRF'
[dcc64 Error] Project2.dpr(170): E2065 Unsatisfied forward or external declaration: 'INIT$_$FPINTRES'
[dcc64 Error] Project2.dpr(170): E2065 Unsatisfied forward or external declaration: 'FINALIZE$_$WINDIRS'
[dcc64 Error] Project2.dpr(170): E2065 Unsatisfied forward or external declaration: 'SYSUTILS$_$TENCODING_$__$$_create'
[dcc64 Error] Project2.dpr(170): E2065 Unsatisfied forward or external declaration: 'SYSUTILS$_$TENCODING_$__$$_destroy'
[dcc64 Error] Project2.dpr(170): E2065 Unsatisfied forward or external declaration: 'INIT$_$SYSUTILS'
[dcc64 Error] Project2.dpr(170): E2065 Unsatisfied forward or external declaration: 'FINALIZE$_$SYSUTILS'
[dcc64 Error] Project2.dpr(170): E2065 Unsatisfied forward or external declaration: 'INIT$_$TYPINFO'
[dcc64 Error] Project2.dpr(170): E2065 Unsatisfied forward or external declaration: 'FINALIZE$_$TYPINFO'
[dcc64 Error] Project2.dpr(170): E2065 Unsatisfied forward or external declaration: 'INIT$_$CLASSES'
[dcc64 Error] Project2.dpr(170): E2065 Unsatisfied forward or external declaration: 'FINALIZE$_$CLASSES'
[dcc64 Error] Project2.dpr(170): E2065 Unsatisfied forward or external declaration: 'THREADVARLIST_$SYSTEM'
[dcc64 Error] Project2.dpr(170): E2065 Unsatisfied forward or external declaration: 'THREADVARLIST_$CLASSES'
[dcc64 Error] Project2.dpr(170): E2065 Unsatisfied forward or external declaration: 'RESSTR_$RTLCONSTS_$$_START'
[dcc64 Error] Project2.dpr(170): E2065 Unsatisfied forward or external declaration: 'RESSTR_$RTLCONSTS_$$_END'
[dcc64 Error] Project2.dpr(170): E2065 Unsatisfied forward or external declaration: 'RESSTR_$SYSCONST_$$_START'
[dcc64 Error] Project2.dpr(170): E2065 Unsatisfied forward or external declaration: 'RESSTR_$SYSCONST_$$_END'
[dcc64 Error] Project2.dpr(170): E2065 Unsatisfied forward or external declaration: 'FPC_LIBINITIALIZEUNITS' 

最佳答案

你不太可能完成这项工作,至少按照书面说明是这样。不满意的声明来自 FPC 运行时。您也需要链接它,或者在 Delphi 中重新实现它。这两种选择都不太可行。

当然,如果您删除了对 Classes 单元的引用,并将这个简单的函数放在单独的代码单元而不是库单元中,那么可能不会出现不满足的声明。也就是说,您肯定正在探索这一点,因为您想要使用实际执行某些操作的 FPC 代码。一旦你这样做了,你就会回到最初的状态。

解决这个问题的方法是动态链接到 FPC 代码。将 FPC 代码编译到库中并动态链接到该库。

<小时/>

只是为了好玩,我尝试将 FPC 对象链接到 Delphi 程序。 FPC单元:

unit unit1;

interface

implementation

function Test(i: Integer): Integer; cdecl;
begin
  Test := i*42;
end;

end.

我编译了这个:

fpc unit1.pp

Then I wrote the following Delphi program to link it:

{$APPTYPE CONSOLE}

{$L 'unit1.o'}

function Test(i: Integer): Integer; cdecl; 
  external name 'UNIT1_TEST$SMALLINT$$SMALLINT';

begin
  Writeln(Test(666));
end.

输出:

27972

请注意,函数名称已被修饰。为了找到名称,我使用了 objdump:

>objdump -d unit1.o

unit1.o:     file format pe-i386


Disassembly of section .text.n_unit1_test$smallint$$smallint:

00000000 :
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 ec 04                sub    $0x4,%esp
   6:   0f bf 45 08             movswl 0x8(%ebp),%eax
   a:   6b c0 2a                imul   $0x2a,%eax,%eax
   d:   66 89 45 fc             mov    %ax,-0x4(%ebp)
  11:   66 8b 45 fc             mov    -0x4(%ebp),%ax
  15:   c9                      leave
  16:   c3                      ret
        ...

我使用 x86 版本的编译器完成了这项工作。我希望它在 x64 下也可行。

因此,您确实可以链接 FPC 目标文件,只要它们足够简单。然而,如果您需要任何 FPC 运行时和标准单元,那么我预计它会变得太难。

关于delphi - 将 FPC .o 文件链接到 Delphi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22041506/

相关文章:

delphi - 在 Pascal 中将文本文件中的字符串读入数组

android - 如何在TWebBrowser中聚焦输入时显示Android的虚拟键盘?

delphi - CTRL + 单击不起作用

Delphi 图像 Canvas ...绘制一个区域(三角形、矩形、多边形)

Delphi 调用 API 函数 (SOAP)

delphi - 字节绝对字符串数组:为64位Windows编译时内容不正确

android - PascalScript 是否与 Delphi XE5 兼容以创建 Android/iOS/Windows 应用程序?

xml - 如何使 TXMLDocument(使用 MSXML 实现)始终包含编码属性?

delphi - FPC 3.0 和 InterlockedCompareExchange

freepascal - 省略汇编器函数的汇编器关键字