情况是这样的:
- 第一个软件包
PackageA.bpl
包含C++类FooA
。该类使用PACKAGE
指令声明。
- 第二个软件包PackageB.bpl
包含从FooA
继承的类,名为FooB
。它包括FooB.h
,并且使用运行时软件包构建软件包,并通过添加对PackageA.bpi
的引用来链接到PackageA
。
- 构建PackageB
时,它能够编译成功,但链接失败,出现许多未解析的外部引用,其中前几个是:
- [ILINK32 Error] Error: Unresolved external '__tpdsc__ FooA' referenced from C:\blah\FooB.OBJ
- [ILINK32 Error] Error: Unresolved external 'FooA::' referenced from C:\blah\FooB.OBJ
- [ILINK32 Error] Error: Unresolved external '__fastcall FooA::~FooA()' referenced from blah\FooB.OBJ
等等。
- 在PackageA.bpl
上运行TDump将显示:Exports from PackageA.bpl
14 exported name(s), 14 export addresse(s). Ordinal base is 1.
Sorted by Name:
RVA Ord. Hint Name
-------- ---- ---- ----
00002A0C 8 0000 __tpdsc__ FooA
00002AD8 10 0001 __linkproc__ FooA::Finalize
00002AC8 9 0002 __linkproc__ FooA::Initialize
00002E4C 12 0003 __linkproc__ PackageA::Finalize
00002E3C 11 0004 __linkproc__ PackageA::Initialize
00006510 14 0007 FooA::
00002860 5 0008 FooA::FooA(FooA&)
000027E4 4 0009 FooA::FooA()
00002770 3 000A __fastcall FooA::~FooA()
000028DC 6 000B __fastcall FooA::Method1() const
000028F4 7 000C __fastcall FooA::Method2() const
00001375 2 000D Finalize
00001368 1 000E Initialize
0000610C 13 000F ___CPPdebugHook
这个类似乎被导出并且可以链接。我能看到ILink32所寻找的特定事物的条目,却没有找到。在BPI文件上运行TDump也显示了类似的条目。
其他信息
虽然在重构成包之前它是一个普通的C ++类,但这个类确实是从TObject继承而来。(更多细节见下文) 无论如何,当尝试解决这种非常Delphi风格的问题时,使用VCL-style类似乎更加“安全”。更改这一点只会将未解决的外部引用顺序更改为首先不找到 Method1
和 Method2
,然后才是其他部分。
FooA
的声明:
class PACKAGE FooA: public TObject {
public:
FooA();
virtual __fastcall ~FooA();
FooA(const FooA&);
virtual __fastcall long Method1() const;
virtual __fastcall long Method2() const;
};
今日免费次数已满, 请开通会员/明日再来
class FooB: public FooA {
public:
FooB();
virtual __fastcall ~FooB();
... other methods...
};
所有方法都在.cpp文件中实现,因此它们不是因为不存在而无法找到!.cpp文件还包含在包含项下方靠近顶部的#pragma package(smart_init)
。
可能有用的问题...
- C++中的包是否可靠,或者它们只能与Delphi代码一起使用?
- 通过添加对其BPI的引用来链接第一个包是否正确 - 这是您应该这样做的方式吗?我可以使用LIB,但似乎会使第二个包更大,并且我怀疑它会静态地链接第一个包的内容。
- 我们只能在基于
TObject
的类上使用PACKAGE
指令吗?在标准C++类上使用它没有编译器警告。 - 将代码拆分成包是实现隔离代码并通过定义的层/接口进行通信的最佳方法吗?我一直在研究这条路,因为它似乎是C ++ Builder / Delphi Way,如果它有效,看起来很有吸引力。但是,是否有更好的替代方案?
- 我非常新于使用包,之前只知道通过使用组件来使用它们。任何一般性建议都将非常有用!
我们正在使用C ++ Builder 2010。我在上面的代码示例中编造了类和方法名称,但除此之外,其余细节都是我们所看到的。