2

C++ の静的リンケージに関する基本的な説明が必要です。data_client.lib というファイルがあります。ライブラリ ファイル a.exe、b.exe、および c.exe には、3 つの独立したコンシューマーがあります。data_client.lib がインターフェイスである data_server.exe というサービスがあります。実際には、data_server.exe に別の関数を追加し、対応するインターフェイスを data_client.lib に追加しました。a.exe だけが追加の機能を必要とするため、a.exe のみをビルドします。data_server.exe、data_client.exe、a.exe をパッチとして出荷しました。これで、b.exe と c.exe がランダムに/一貫性なくスローしてクラッシュする

mfc42u!CException::`RTTI 完全オブジェクト ロケータ'+0x10

それは理にかなっていますか?b.exe と c.exe もビルドすると、クラッシュは発生しません。これが機能する方法ですか?

4

3 に答える 3

2

明示的な依存関係がないかもしれませんが、プロジェクト ヘッダーの一部は、ライブラリに暗黙的に情報を使用したり、配置したりします。

于 2009-11-30T13:55:35.720 に答える
2

エラーについてはわかりませんが、アプリケーション b.exe と c.exe は古いバージョンのバインディング ライブラリを使用して、新しいバージョンの data_server.exe と通信しています。関数を追加した場合、一部の v_table インデックスがオフになっている可能性があります。間違いなくすべてのライブラリを再構築する必要があります。

于 2009-11-30T14:01:45.380 に答える
2

実際には、data_server.exe に別の関数を追加し、対応するインターフェイスを data_client.lib に追加しました。

これでは、ライブラリに何が追加されたのか正確にはわかりません。ただし、それがクラスに追加された新しいメソッドまたはメソッドである場合 (単なる新しいスタンドアロン関数ではなく)、すべてを再コンパイルすると問題が解決する可能性が非常に高くなります。変更によって、vtableが暴走する場合とそうでない場合があります。

また、クラッシュがこれとはまったく関係がなく、他の問題が発生している可能性もあります...しかし、あなたの説明から、私のお金はvtableの問題にあります。私だったら、b.exe と c.exe を再コンパイルして、他の問題を調査する前にもう一度テストします。

于 2009-11-30T14:51:16.247 に答える