将FPC.o文件链接到Delphi

将FPC.o文件链接到Delphi,delphi,freepascal,delphi-xe5,fpc,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): E206

如何将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中重新实现它。这两种选择都不太可行

当然,如果您删除了对
单元的引用,并将此简单函数放在单独的代码单元而不是库单元中,那么可能没有未满足的声明。这就是说,您肯定在探索这一点,因为您希望使用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 输出:

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


因此,您确实可以链接FPC对象文件,只要它们足够简单。然而,如果您需要任何FPC运行时和标准单元,那么我认为这将变得太难了

您可以通过使用Delphi RTL绕过RTL问题。但我不确定这是否可以编译。你不能仅仅替换任何旧的RTL。它必须是正确的。FPC和Delphi具有不同的RTL。同样,仅仅因为它们具有相同的名称(RTL),并不意味着它们是可互换的。当您尝试使用更复杂的类型时,会出现更大的问题。甚至可以将它们用作导出函数的参数/返回值。不能跨互操作边界使用标准C互操作类型(整型、浮点型、指针)以外的类型。我知道雷米和我在你之前的问题上告诉过你,而你似乎不相信我们。但这是真的。
System.pas
呢?你是说德尔福系统单位?这对任何FPC代码都没有用。可以通过添加[public,别名:'namethayoulike']来设置符号的非混合名称;在电话会议之后。哦,FPC系统单元是“system.pp”,但你当然是对的。出于兴趣,为什么你不能用Delphi编译FPC代码?(有很多可能的原因,但如果你能告诉我为什么我们可以提供帮助。)这样做可以避免整个问题,你可以完全正常地使用你的代码。@DavidM更多的优化,更多的FPU选择。这就是为什么。Delphi 32位编译器是否有
SSE3
?@user3060326如果您想要真正优化的代码,那么您可以编写asm。或者你可以使用一个好的C++编译器。FPC是否产生高度优化的FP代码?我敢打赌英特尔C++编译器更好。@ DaviHeffelnnC++选项是可行的,但不太可能。你必须坚持C风格代码。 27972 >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 ...