ILINK32エラーの原因:未解決の外部「__fastcall System :: TObject :: NewInstance(System :: TMetaClass *)」はXXX.objから参照されていますか?

StackOverflow https://stackoverflow.com/questions/1420515

  •  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ファイルをアクティブなプロジェクトに含めると、リンク段階で上記のエラーが発生します。

このエラーに関する奇妙なことは次のとおりです。

  1. このエラーは、すべてのマシンまたはC ++ Builderのインストールでは再現できません(少なくとも5つチェックしました)。
  2. obj-fileを削除し、代わりに対応するpasファイルをプロジェクトに追加すると、エラーが消えます。
  3. ただし、pas-fileを削除してobj-fileを再度含めると、エラーは発生しません。
  4. プロセスでpasファイルのobjのいずれも変更されません。つまりこのファイルのセットをマシンから削除し、最初のマシン(それらが作成された場所)から再びそれらを持ってくる場合-エラーはありません。
  5. 特定のマシンでそのシーケンスを実行すると(プロジェクトから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または何らかの外部ライブラリを作成していますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top