ILINK32错误的原因:从XXX.obj引用的未解析的外部'__fastcall System :: TObject :: NewInstance(System :: TMetaClass *)'?

StackOverflow https://stackoverflow.com/questions/1420515

  •  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文件包含到活动项目时,我在链接阶段得到了上述错误。

这个错误的奇怪之处在于:

  1. 此错误不能在每台计算机或C ++ Builder安装上重现(我已检查过至少5个)。
  2. 如果删除obj文件,而是将相应的pas文件添加到项目中,则错误将消失。
  3. 但是如果删除pas-file并再次包含obj文件,则不会出现错误。
  4. 在此过程中没有修改pas文件的obj。即如果你从机器中删除这组文件并再次从第一台机器(它们被创建的地方)带来它们 - 你仍然没有错误。
  5. 在一台特定的计算机上执行该序列(包含/排除项目中的pas-file) - 无论您尝试多么努力(在文件夹之间移动文件,使用设置进行操作),您都无法再在该计算机上出现此错误等等)。实际上,我已经没有机器了,我现在可以重现这个错误:(
  6. 我没有看到,“之后”的情况如何?不同于“之前”的情况(在包含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()函数并链接到二进制文件?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top