モノリシックな EXE を EXE といくつかのパッケージの組み合わせに分割しようとしています。これまでのところ、使用しようとしているパッケージが 1 つあります。EXE Codeguard を実行すると、起動時に次のエラーが表示されます。
CGエラー 2 つの異なる CRTLDLL がロードされます。CG が誤ったエラーを報告することがある (C:\Windows\system32\CC32100MT.DLL) (D:\Projects\Foo\Bar.bpl) わかった
私はこれを、2 つの異なるランタイム ライブラリが読み込まれていると読みました。
プログラムの実行を続けると、奇妙なエラーが表示されます。特に、クラス間でキャストしたり、EXE/DLL の境界を越えるメソッドのパラメーターとしてクラスへのポインターを渡したりしています。ただし、Codeguard 自体には、他のエラーはまったく表示されません。 編集:これは現在解決されており、関連していませんでした。プログラムは正しく実行されているように見えますが、Codeguard が表示する警告は依然として心配です。
これをどのように解決しますか?
いくつかの詳細
私たち (これに取り組んでいる開発者と私) がまとめて考えられる限り多くのことを検討しました。
各プロジェクトは、ランタイム パッケージを使用してビルドされます。EXE ホストは、そのパッケージ リストに Bar をリストします。
各プロジェクトは、動的 RTL でコンパイルするように設定されています。ただし、これを変更しても問題は解決しません。
パッケージは BPI ファイルを介して EXE にリンクされますが、LIB を介してリンクしても違いはありません。
EXE と BPL は同じプロジェクト設定でコンパイルされ、両方のタイプのプロジェクトに同じオプションが存在します。とにかく、私たちは考えます:)
システムには BPL と BPI のコピーが 1 つだけあります。これは間違いなく正しいものにリンクしています。
と を使用して EXE と BPL を調べると、
Depends
両方TDump
が を使用していることがわかりC:\Windows\system32\CC32100MT.DLL
ます。どちらも 1 つの RTL を使用する必要があります。新しいプロジェクト (プレーンな VCL フォーム アプリケーション) を作成し、(BPI を介して) BPL にリンクすると、正常に動作します。これを変更するために必要なコードを EXE に含めるすべてのファイルと LIB を追加する過程で何かが行われていますが、何が原因かはわかりません。
LIB はすべて、私たちが使用する DLL (フラット C インターフェイス、通常は MSVC でビルドされたかのように見えます) に対応するか、EXE にリンクする目的で lib にコンパイルされた、多数の関連ファイルを含む単純なプロジェクトです。これらはおおまかに対応しています。ちなみに、BPLに分割したいプログラムの領域に。見逃していない限り、RTL リンクに影響する LIB プロジェクトのプロジェクト オプションはないようです。
私は
Depends
、EXE およびすべての DLL が参照するすべての RTL および CC32*.dll ファイルを徹底的に探し出して調べました。rtl140.bpl と CC32100MT.DLL はすべて同一です。完全修飾パスは、それらが同じファイルであることも示しています。すべてが 1 つの同じランタイム ライブラリを使用する必要があります。
編集: 最終的な EXE は複雑で、いくつかのライブラリ、いくつかの DLL などでビルドされています。これらはすべて、C++Builder でビルドすると、現在のバージョンでビルドされます。これらの DLL または LIB のいずれかに問題を引き起こす可能性のあるものがある可能性はありますか? RTL がどのようにリンクされているかについては、どこを見ればよいかを確認するのに十分な知識がありません... 私の (素朴な?) 仮定では、リンカは通常、RTL 関数の 1 つのセットにリンクしますが、もちろんそうではありません。起こっているようです...そして、パッケージを使用すると状況がどのように変化するかわかりません。パッケージのような動的なものを使用したことがないため、このエラーが常に存在し、Codeguard が以前にフラグを立てていなかった可能性はありますか?
おそらく別の質問は、パッケージが独自の RTL を持っているのはなぜですか、または Codeguard にとって「RTL DLL」とみなされる理由は何ですか?
私たちは困惑しています。絶対に困惑した。BPL を使用する際には他にも問題がありましたが (特に C++ を使用すると、驚くほどトリッキーなようです)、すべて解決することができました。これはまったく運がなかったので、洞察をいただければ幸いです:)
C++Builder 2010 を使用しています(実際には RAD Studio の一部ですが、コンポーネント以外に Delphi コードはほとんどありません)。
編集:賞金を開始しました。どうしても解決したい!
編集 2: David Deanの助けに感謝します (以下に回答としてマークされています)。電子メールで、彼はこの問題が他の誰かによって単純なテスト ケースで再現され、レポート 86335 として Embarcadero QC に記録されていることを指摘しました。現在のところ修正はありませんが、警告は本物の問題を示しているようには見えません (つまり、おそらく偽のエラーであり、実行時にダイアログをクリックして先に進む必要があるのは残念ですが、エラーで心配することは何もないことを願っています)。約。)