【问题标题】:Causes for ILINK32 Error: Unresolved external '__fastcall System::TObject::NewInstance(System::TMetaClass *)' referenced from XXX.obj?ILINK32 错误的原因:从 XXX.obj 引用的未解析的外部“__fastcall System::TObject::NewInstance(System::TMetaClass *)”?
【发布时间】:2009-09-14 09:28:29
【问题描述】:

我从 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 文件并再次包含 obj 文件 - 将不会出现错误。
  4. 在此过程中,pas 文件的任何 obj 都不会被修改。 IE。如果您从机器中删除这组文件,然后再次从第一台机器(它们的创建位置)带入它们 - 您仍然不会出错。
  5. 一旦您在一台特定机器上执行该序列(在项目中包含/排除 pas 文件) - 无论您多么努力(在文件夹之间移动文件、使用设置),您都无法再在该机器上收到此错误等)。实际上,我已经没有机器,我现在可以在其中重现此错误:(

我看不出,“之后”的情况与“之前”的情况(包含 pas 文件之后/之前)有何不同,因此错误仅在之前可见,之后不可见。

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

我错过了什么吗?现在对我来说,它看起来像是 C++ Builder 的错误。

附:我们不能使用“仅包含 pas-file”解决方案,因为我们只需要在某些机器上部署 .hpp.obj(没有 .pas 文件)。

【问题讨论】:

    标签: c++ linker c++builder


    【解决方案1】:

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

    virtual void getMaxSafeSpace();
    

    而不是:

    virtual void getMaxSafeSpace()=0;
    

    在我的抽象类中。

    【讨论】:

      【解决方案2】:

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

      您的项目是否正在创建 dll 或某种外部库,其中 System::TObject::NewInstance() 函数已定义并链接到二进制文件?

      【讨论】:

      • System::TObject::NewInstance 是标准 RTL 的一部分,它始终链接在应用程序中(是应用程序的一部分)。 IE。它不能未实现。项目既不是 DLL 也不是包 - 只是一个普通的 VCL(即 Win32)GUI 应用程序。当然,我们的代码中没有重新定义内置 RTL 函数这样的事情。
      【解决方案3】:

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

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

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

      【讨论】:

      • 此答案中的链接已损坏。如果实际答案包含在答案中而不仅仅是链接到,那就太好了。
      • @HappyCoding - 实际上,如果 Embarcadero 每 2 年停止更改这些页面的 URL,那就更好了! :) 应该有人教他们那些“301”重定向! hochmanconsultants.com/301-vs-302-redirect
      猜你喜欢
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      • 2010-11-07
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      相关资源
      最近更新 更多