ILINK32错误的原因:从XXX.obj引用的未解析的外部'__fastcall System :: TObject :: NewInstance(System :: TMetaClass *)'?
-
07-07-2019 - |
题
我从C ++ Builder 2009的链接器
收到以下错误Unresolved external '__fastcall System::TObject::NewInstance(System::TMetaClass *)' referenced from XXX.obj?
我们有一组Delphi文件( .pas
)和一组C ++ Builder文件( .hpp
和 .obj
),其中是从这些 .pas
文件生成的。
将文件集复制到另一台计算机。两台机器都具有完全相同的C ++ Builder 2009版本,并且安装了相同的更新(最新版本:3 + 4)。
当我在其他机器上的C ++ Builder中创建一个空的VCL应用程序并将该集合中的一个obj文件包含到活动项目时,我在链接阶段得到了上述错误。
这个错误的奇怪之处在于:
- 此错误不能在每台计算机或C ++ Builder安装上重现(我已检查过至少5个)。
- 如果删除obj文件,而是将相应的pas文件添加到项目中,则错误将消失。
- 但是如果删除pas-file并再次包含obj文件,则不会出现错误。
- 在此过程中没有修改pas文件的obj。即如果你从机器中删除这组文件并再次从第一台机器(它们被创建的地方)带来它们 - 你仍然没有错误。
- 在一台特定的计算机上执行该序列(包含/排除项目中的pas-file) - 无论您尝试多么努力(在文件夹之间移动文件,使用设置进行操作),您都无法再在该计算机上出现此错误等等)。实际上,我已经没有机器了,我现在可以重现这个错误:( 醇>
我没有看到,“之后”的情况如何?不同于“之前”的情况(在包含pas文件之后/之前),因此错误仅在之前而不是之后可见。
互联网上唯一提到的这个错误(或非常类似的错误)是这个。但是没有解决方案。没有“+”路径中的字符也不是空格(“"”。
我错过了什么吗?现在它看起来像C ++ Builder的bug。
P.S。我们不能使用“只包括pas文件”解决方案,因为我们只需要将 .hpp
和 .obj
(没有 .pas
文件)部署到某些机器上。
解决方案 3
好的,我找到了答案:原因是IDE或项目的设置有些错误(我不确定)。
我安装了多个版本的C ++ Builders和Delphis。由于某种原因,C ++ Builder的2009链接器选择了错误的obj文件 - 这些文件应该用于另一个版本(可能是2007年)。
错误的原因是NewInstance在2007年和2009年版本之间发生了变化 - 请参见此处: https://forums.codegear.com/thread.jspa?messageID=161105
其他提示
我也遇到了这个错误,但那是因为我有 这个定义:
virtual void getMaxSafeSpace();
而不是:
virtual void getMaxSafeSpace()=0;
在我的抽象课中。
看起来如果你从pas文件构建项目,那么函数的副本‘ __ fastcall System :: TObject :: NewInstance(System :: TMetaClass *)’正在某处定义,但不在obj文件中,并链接到二进制文件。定义函数后,XXX.obj文件就会找到它。因此,如果删除当前的obj文件并从另一台机器上带来obj文件,则不会看到错误。这只是我的想法。我既不知道Delphi,也不了解pas文件或C ++ Builder。
你的项目是创建dll还是某种外部库,其中定义了System :: TObject :: NewInstance()函数并链接到二进制文件?