我从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文件包含到活动项目时,我在链接阶段得到了上述错误。
这个错误的奇怪之处在于:
我没有看到,“之后”的情况如何与“之前”(包含pas文件之前/之后)的情况不同,因此错误只在之前而不是之后可见。
互联网上唯一提到的错误(或非常类似的错误)是this。但是没有解决方案。路径中没有“+”字符,也没有空格(“”)。
我错过了什么吗?现在它看起来像C ++ Builder的bug。
P.S。我们不能使用“只包含pas-file”解决方案,因为我们只需要将.hpp
和.obj
(无.pas
个文件)部署到某些计算机上。
答案 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