ILINK32エラーの原因:未解決の外部「__fastcall System :: TObject :: NewInstance(System :: TMetaClass *)」はXXX.objから参照されていますか?
-
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
ファイルから生成されました。
ファイルのセットが別のマシンにコピーされます。両方のマシンには、同じアップデート(最新:3 + 4)がインストールされた、まったく同じC ++ Builder 2009バージョンがあります。
他のマシンのC ++ Builderで空のVCLアプリケーションを作成し、このセットから1つのobjファイルをアクティブなプロジェクトに含めると、リンク段階で上記のエラーが発生します。
このエラーに関する奇妙なことは次のとおりです。
- このエラーは、すべてのマシンまたはC ++ Builderのインストールでは再現できません(少なくとも5つチェックしました)。
- obj-fileを削除し、代わりに対応するpasファイルをプロジェクトに追加すると、エラーが消えます。
- ただし、pas-fileを削除してobj-fileを再度含めると、エラーは発生しません。
- プロセスでpasファイルのobjのいずれも変更されません。つまりこのファイルのセットをマシンから削除し、最初のマシン(それらが作成された場所)から再びそれらを持ってくる場合-エラーはありません。
- 特定のマシンでそのシーケンスを実行すると(プロジェクトからpasファイルを含める/除外する)-どんなに努力しても、そのマシンではこのエラーを取得できなくなります(フォルダ間でファイルを移動し、設定で再生します)など)。実際、マシンはまだないので、今すぐこのエラーを再現できます:(
どのように「後」の状況かわかりません。 「前」の状況とは異なります(pas-fileのインクルード後/前)、エラーは後ではなく前にのみ表示されます。
インターネット上でこのエラー(または非常によく似たエラー)について言及しているのはこれ。しかし、解決策はありません。 「+」はありません。パス内の文字とスペース("")。
何か不足していますか?現時点では、C ++ Builderのバグのように見えます。
PS 「pas-fileを含めるだけ」を使用することはできません。ソリューション。特定のマシンに .hpp
および .obj
( .pas
ファイルなし)のみをデプロイする必要があるため。
解決 3
OK、答えを見つけました。理由は、IDEまたはプロジェクトの設定が間違っていたためです(確かではありません)。
C ++ BuilderとDelphisのいくつかのバージョンがインストールされています。そして、何らかの理由で、C ++ Builderの2009リンカが間違ったobjファイルを選択しました。これは、別のバージョン(2007年の可能性がある)で使用されるファイルです。
エラーの理由は、2007年と2009年のバージョン間でNewInstanceが変更されたことです-こちらをご覧ください: 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についてもまったく知りません。
あなたのプロジェクトは、System :: TObject :: NewInstance()関数が定義されバイナリにリンクされているdllまたは何らかの外部ライブラリを作成していますか?