繁体   English   中英

无法在 BPL 中找到未解析的外部/过程入口点

[英]Unresolved external / procedure entry point could not be located in BPL

我在继承自TFileStream的现有项目中有一个名为TTextStream的 class 。 它有一组重载的operator<<operator>> function 作为成员函数。

class PACKAGE TTextStream : public TFileStream

大多数建议相反,您应该为这些操作员编写外部函数,并使他们成为相关 class 的朋友,以便能够访问私有和受保护的成员。

因此,作为浏览和清理代码的一部分,我这样做了。

并添加了 function 的示例

TTextStream& __fastcall operator >>(TTextStream& ts, AnsiString& s);

然后像往常一样在.cpp中实现。

然后在我添加的TTextStream class

friend TTextStream& __fastcall operator >>(TTextStream& ts, AnsiString& s);

该项目产生一个C++ Builder package (BPL) ,我们称之为Foo.bpl 它编译得很好,然后我继续编译下一个 BPL package, Bar.bpl ,它使用来自Foo.bpl的功能。

所有这些 BPL 都输出到“默认”文件夹C:\Users\Public\Documents\Embarcadero\Studio\20.0\BLP

Foo.bpi添加在Bar.bpl项目的Requires下。

在建造时我得到了

[ilink32 Error] Error: Unresolved external '__fastcall operator >>(TTextStream&, System::AnsiStringT<0>&)' referenced from BLABLABLA.OBJ

如果我尝试与Foo.lib静态链接,它可以正常工作。 经过一番挖掘,我得出的结论是 function 没有正确导出到Foo.bpl

据我了解,我必须为此使用PACKAGE宏,因此我将其添加到.h文件中的定义和.cpp文件中的实现中。

PACKAGE TTextStream& __fastcall operator <<(TTextStream& ts, const AnsiString& s);

我重新编译Foo.bpl ,然后编译Bar.bpl ,它现在可以正常编译和链接。 But Bar.bpl is a runtime and design time package and when I go to install it in the IDE a Windows message dialog pops up with basically the same message as before.

The procedure entry point @$blsh$qr11TTextStreamrx27System@%AnsiStringT$us$i0$% could not be located in the dynamic library C:\Users\Public\Documents\Embarcadero\Studio\20.0\BPL\Dcl\Bar.bpl

所以它似乎抱怨没有找到 function,这似乎是在Bar.bplFoo.bpl中导出的?

不太确定我错过了什么。 TDUMP似乎表明它实际上正在被导出。

C:\Users\Public\Documents\Embarcadero\Studio\20.0\Bpl>tdump -oiEXTDEF Foo.bpl | grep TTextStream
File STDIN:
    00050668  211 0000 __fastcall operator <<(TTextStream&, const char *)
    000505D8  210 0001 __fastcall operator <<(TTextStream&, System::WideString&)
    0005057C  209 0002 __fastcall operator <<(TTextStream&, System::AnsiStringT<0>&)
    00051350  213 0003 __fastcall operator >>(TTextStream&, System::WideString&)
    000506B0  212 0004 __fastcall operator >>(TTextStream&, System::AnsiStringT<0>&)
    00051D6C  218 0009 __tpdsc__ TTextStream
    00051D3C  217 00DB TTextStream::
    00051A18  216 00DC TTextStream::operator =(TTextStream&)
    00050150  207 00DD __fastcall TTextStream::TTextStream(System::AnsiStringT<0>&, unsigned short, TEOLMode)
    0005157C  215 00DE TTextStream::TTextStream(TTextStream&)
    000514F4  214 00DF __fastcall TTextStream::~TTextStream()
    0005051C  208 00E0 __fastcall TTextStream::WriteEOL()

或不拆线

EXPORT ord:0211='@$blsh$qr11TTextStreampxc'
EXPORT ord:0210='@$blsh$qr11TTextStreamrx17System@WideString'
EXPORT ord:0209='@$blsh$qr11TTextStreamrx27System@%AnsiStringT$us$i0$%'
EXPORT ord:0213='@$brsh$qr11TTextStreamr17System@WideString'
EXPORT ord:0212='@$brsh$qr11TTextStreamr27System@%AnsiStringT$us$i0$%'
EXPORT ord:0218='@$xp$11TTextStream'
EXPORT ord:0050='@TLangFormNode@SaveToASCII$qqrp11TTextStreamui'
EXPORT ord:0217='@TTextStream@'
EXPORT ord:0216='@TTextStream@$basg$qrx11TTextStream'
EXPORT ord:0207='@TTextStream@$bctr$qqrrx27System@%AnsiStringT$us$i0$%us8TEOLMode'
EXPORT ord:0215='@TTextStream@$bctr$qrx11TTextStream'
EXPORT ord:0214='@TTextStream@$bdtr$qqrv'
EXPORT ord:0208='@TTextStream@WriteEOL$qqrv'

我还测试了其他调用约定以排除这种情况。

作为辅助测试,我还创建了一个小测试用例。

生成带有单元 (functions.h/functions.cpp) 的 bpl 的项目添加了单个 function

#ifndef __MYFUNCS__
#define __MYFUNCS__
#pragma package(smart_init)

PACKAGE int add(int a, int b)

#endif

这只是将两个数字相加,并在 .cpp 文件中实现。 编译并链接 BPL。

然后我创建了一个控制台应用程序,它需要有问题的 bpl,包括 header 文件和 function 定义(functions.h),编译并且链接失败并出现相同的错误。 所以我可能错过了一些明显的小事......

所有这些都是使用RAD Studio 10.3.2完成的,而不是使用经典编译器。

在遇到这种情况几次之后,我终于找到了一种似乎可以“修复”它的方法。 几个 BPL 项目,其中一些包含 IDE 组件在我更改命名空间或其他内容时拒绝安装并显示“过程入口点”消息。 函数已正确导出到 BPL,最终使它能够安装新版本的组件 BPL 的是

  • 从 IDE 卸载组件
  • 构建 BPL 项目

在此之后安装给出了错误,而不是

  • 关闭 IDE
  • 启动 IDE 备份
  • 再次加载项目
  • 安装组件

我不知道为什么会这样,但现在 5 个项目都运行良好。 我猜一些缓存或某些东西让我搞砸了。 或者,可能首先卸载的旧 BPL 实际上并没有完全删除。

如果有人知道发生了什么,我会很高兴获得这些信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM