gpt4 book ai didi

delphi - 使用 'dcc32 -JL' 编译时从另一个包中的另一个单元访问 Delphi 方法指针

转载 作者:行者123 更新时间:2023-12-02 07:42:01 25 4
gpt4 key购买 nike

这是一个有点复杂的场景 - 在实践中甚至更复杂,但我设法将这个问题最小化。

我定义了两个Delphi包:BasePackage.dpk和AnotherPackage.dpk

package BasePackage;

requires
rtl;

contains
Base in 'Base.pas';

end.

package AnotherPackage;

requires
BasePackage;

contains
Another in 'Another.pas';

end.

和单位

unit Base;

interface

type
TMethod = procedure;

TEncodeableType = record
Method: TMethod;
end;
PEncodeableType = ^TEncodeableType;

procedure Method_Impl;

const
TestMethod_Type: TEncodeableType = (
Method: Method_Impl;
);

implementation

procedure Method_Impl;
begin
end;

end.

unit Another;

interface

uses
Base;

implementation

const
ResponseType: PEncodeableType = @TestMethod_Type;

end.

基本上一切都编译得很好,我什至可以使用 'dcc32 -JPHNEK --BCB' 生成基本的 C++Builder 单元,但是当我尝试为 C++Builder 生成库文件时使用 'dcc32 -JPHNEK --BCB -JL' 我明白了

>dcc32  -JPHNEK --BCB -JL BasePackage.dpk
Embarcadero Delphi for Win32 compiler version 32.0
Copyright (c) 1983,2017 Embarcadero Technologies, Inc.
BasePackage.dpk(10)
11 lines, 0.09 seconds, 3688 bytes code, 176 bytes data.
>dcc32 -JPHNEK --BCB -JL AnotherPackage.dpk
Embarcadero Delphi for Win32 compiler version 32.0
Copyright (c) 1983,2017 Embarcadero Technologies, Inc.
AnotherPackage.dpk(10)
Error: E2201 Need imported data reference ($G) to access 'TestMethod_Type' from unit 'Another'

我尝试过使用不同的编译选项(当然还向单元和包引入 {$G+}{$IMPORTEDDATA ON} (尽管它是无论如何默认),但还没有看到它们有任何区别。

这些包是在 .cfg 中不使用任何选项或使用这些选项进行编译的:

-$A+
-$B-
-$C-
-$D-
-$E-
-$F-
-$G+
-$H+
-$I-
-$J-
-$K-
-$L+
-$M-
-$N+
-$O+
-$P+
-$Q-
-$R-
-$S-
-$T+
-$U-
-$V-
-$W-
-$X+
-$Y-
-$Z1
-cg
-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
-H+
-W+
-M
-$M16384,1048576
-K$00300000
-Z

.dpk 中可以不带任何选项,也可以带以下选项:

{$ALIGN 8}
{$ASSERTIONS ON}
{$BOOLEVAL OFF}
{$DEBUGINFO ON}
{$EXTENDEDSYNTAX ON}
{$IMPORTEDDATA ON}
{$IOCHECKS ON}
{$LOCALSYMBOLS ON}
{$LONGSTRINGS ON}
{$OPENSTRINGS ON}
{$OPTIMIZATION ON}
{$OVERFLOWCHECKS ON}
{$RANGECHECKS ON}
{$REFERENCEINFO OFF}
{$SAFEDIVIDE OFF}
{$STACKFRAMES OFF}
{$TYPEDADDRESS OFF}
{$VARSTRINGCHECKS ON}
{$WRITEABLECONST ON}
{$MINENUMSIZE 1}
{$IMAGEBASE $300000}
{$DESIGNONLY}
{$IMPLICITBUILD OFF}

知道我是否可以完成这项工作(我真的需要不同包中的功能)吗?

我一直在使用 Delphi 10.2 Tokyo 和 XE4 进行编译,结果相同。

最佳答案

我认为这是一个编译器问题,因此可能无法完全像这样解决我的情况。但是,我可以使用变量而不是常量来声明映射(实际上我有几个这样的内部结构)。

因此,这个版本的 Another.pas 可以编译并运行:

unit Another;

interface

uses
Base;

implementation

var
ResponseType: PEncodeableType;

initialization
ResponseType := @TestMethod_Type;

end.

关于delphi - 使用 'dcc32 -JL' 编译时从另一个包中的另一个单元访问 Delphi 方法指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52041446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com