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

时间:2009-09-14 09:28:30

标签: c++ linker c++builder

我从C ++ Builder 2009的链接器

收到以下错误
Unresolved external '__fastcall System::TObject::NewInstance(System::TMetaClass *)' referenced from XXX.obj?

我们有一组Delphi文件(.pas)和一组C ++ Builder文件(.hpp.obj),它们是从这些.pas个文件生成的。 / p>

将文件集复制到另一台计算机。两台机器都具有完全相同的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文件之前/之后)的情况不同,因此错误只在之前而不是之后可见。

    互联网上唯一提到的错误(或非常类似的错误)是this。但是没有解决方案。路径中没有“+”字符,也没有空格(“”)。

    我错过了什么吗?现在它看起来像C ++ Builder的bug。

    P.S。我们不能使用“只包含pas-file”解决方案,因为我们只需要将.hpp.obj(无.pas个文件)部署到某些计算机上。

3 个答案:

答案 0 :(得分:1)

我也遇到了这个错误,但那是因为我有 这个定义:

virtual void getMaxSafeSpace();

而不是:

virtual void getMaxSafeSpace()=0;

在我的抽象课中。

答案 1 :(得分:0)

看起来如果你从pas文件构建项目,那么函数'__fastcall System :: TObject :: NewInstance(System :: TMetaClass *)'的副本正在某处定义,但不在obj文件中,并链接到二进制文件。定义函数后,XXX.obj文件就会找到它。因此,如果删除当前的obj文件并从另一台机器上带来obj文件,则不会看到错误。这只是我的想法。我既不知道Delphi,也不了解pas文件或C ++ Builder。

你的项目是创建dll还是某种外部库,其中定义了System :: TObject :: NewInstance()函数并链接到二进制文件?

答案 2 :(得分:0)

好的,我找到了答案:原因是IDE或项目的设置有些错误(我不确定)。

我安装了多个版本的C ++ Builders和Delphis。由于某种原因,C ++ Builder的2009链接器选择了错误的obj文件 - 这些文件应该用于另一个版本(可能是2007年)。

错误的原因是NewInstance在2007年和2009年版本之间发生了变化 - 请参见此处:https://forums.codegear.com/thread.jspa?messageID=161105