代码之家  ›  专栏  ›  技术社区  ›  Alex

ILINK32错误的原因:从XXX.obj引用的未解析外部“\uu fastcall System::ToObject::NewInstance(System::TMetaClass*)”?

  •  4
  • Alex  · 技术社区  · 15 年前

    我从C++ Builder 2009的链接器中得到以下错误

    Unresolved external '__fastcall System::TObject::NewInstance(System::TMetaClass *)' referenced from XXX.obj?
    

    我们有一组Delphi文件( .pas )和C++ Builder文件集 .hpp .obj ),这是由这些 .pas 文件夹。

    当我在其他机器上在C++ Builder中创建一个空VCL应用程序,并将一个Object文件从这个集合中包含到活动项目时,在链接阶段得到上述错误。

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

    1. 此错误可以在每台机器或C++ Builder安装中复制(我至少检查了其中的5个)。
    2. 如果删除obj文件,而是将相应的pas文件添加到项目中,则会出现错误。
    3. 但是,如果您删除pas文件并再次包含obj文件,则不会出现错误。
    4. pas文件的obj在此过程中未被修改。也就是说,如果您从机器上删除这组文件,并将它们从第一台机器(创建它们的地方)上再次带来,您仍然不会有错误。
    5. 一旦您在一台特定的机器上执行该顺序(从项目中包括/排除pas文件)-无论您如何努力(在文件夹之间移动文件、播放设置等),您都无法再在该机器上获得此错误。事实上,我已经没有机器了,我现在可以复制这个错误:(

    我看不出,情况“after”与情况“before”(包含pas文件之后/之前)有什么不同,所以错误只在前面可见,后面不可见。

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

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

    另外,我们不能使用“仅包含pas文件”解决方案,因为我们只需要部署 .水电站 B.obj (否) 文件)到某些机器。

    3 回复  |  直到 7 年前
        1
  •  1
  •   Luca Guarro    7 年前

    我也犯了这个错误,但那是因为我 这就定义了:

    virtual void getMaxSafeSpace();
    

    而不是:

    virtual void getMaxSafeSpace()=0;
    

    在我的抽象课上。

        2
  •  0
  •   Donotalo    15 年前

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

        3
  •  0
  •   Alex    15 年前

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

    我有几个版本的C++ Bu建器和Delphis安装。由于某些原因,C++ Builder的2009链接器拾取了错误的Obj-文件,这些文件应该用于另一个版本(可能的2007)。

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