1

別のコンピューターでプロジェクトをビルドして実行する際に奇妙な問題が発生しています。サイドバイサイドエラーです。通常、原因は c++ redistributable がマシンにインストールされていないことなどです。ただし、この場合、プロジェクトはそのマシンでコンパイルされます。MSVC++ 2005 がインストールされ、ランタイムがそこにあるはずです (とにかく、適切な測定のためにランタイムを再度インストールしました)。リンカがマシンで利用できないランタイム ライブラリを参照しているのはなぜですか?

ランタイム ライブラリに動的にリンクしています。

この問題をデバッグする方法についてのアイデアはありますか?

ありがとう。

編集

関連しているので、別の投稿を開始したくありませんでした。この DLL バージョンの混乱のために、ランタイムに静的にリンクする正当な理由はありますか? これらの問題をすべて回避できますか?ランタイムに動的にリンクする利点はもうありません。私は、DLL ランタイムを使用すると、新しい DLL による更新/バグ修正の利点が得られるという印象を受けました。ただし、SxS とマニフェストにより、特定のバージョン (古いバージョン) の DLL をロードすることが保証されますか? では、動的ランタイムのポイントは何でしょうか? すべての依存ライブラリに再利用された関数を埋め込んでいないため、おそらく数 kb のスペースが節約されます。しかし、これを、一部の古いランタイム バージョンがマシンから削除されたためにアプリが実行されない場合のコストと比較してください。

再度、感謝します。まだ元の問題を追跡しており、おそらく使用しているすべてのライブラリを再コンパイルする必要があります。

4

4 に答える 4

5

sxstraceSxS に関して何が起こっているかを正確に教えてくれます。検索された dll と、それらが実際のバージョンにどのようにマップされているかが表示されます。

これで、読み込まれるランタイムは、プロジェクトに含まれるマニフェスト ファイルから取得されます。あなたが言及したものを見ると、サービスパックのないVisual2005のもののように見えます。SP1 は、crt を 8.0.50727.762 に変更しました

Vista および XP での sxstrace の詳細

質問に質問を追加したので、私の回答に回答を追加させてください。SxS は、マニフェスト内で指定したバージョンを必ずしもロードするとは限りません。SxS システムは、特定のバージョンに加えられたセキュリティ修正を追跡します。たとえば、特定のバージョンを要求した場合でも、ロードするバージョンを変更します。

とはいえ、プログラムで DLL を使用していて、それらの間で C オブジェクト (malloc されたメモリなど) を共有したい場合は、CRT DLL しか選択肢がありません。それは本当にあなたの制約が何であるかに依存します。

于 2009-10-13T16:07:55.503 に答える
1

サードパーティのライブラリまたはオブジェクトファイルに沿ってコンパイルすると、別のマシンでコンパイルされ、問題が発生したマシンにコピーされた場合に発生する可能性があります。

お使いのマシンでそのようなバイナリファイルを見つけて、そのマシンで再コンパイルしてみてください。

于 2009-10-13T16:02:30.757 に答える
1

問題への回答ではなく、この質問への回答:

リンカがマシンで利用できないランタイム ライブラリを参照しているのはなぜですか?

リンカーは、実際のランタイム ライブラリをリンクする必要はありません。リンク時に必要なのは (通常) .lib ファイルだけです。.lib ファイルは、OS が実行時に dll を見つけたときに、ランタイム ライブラリが (エクスポートされたシンボルのように) 何を提供するかをリンカに伝えます。

Dependency Walkerは、このような場合に問題をデバッグするのに役立ちます。

編集:新しい質問へのフォローアップ。静的リンクはこれらの問題を解決しますが、いくつかの新しい問題も引き起こします。dll 間で動的に割り当てられたオブジェクトを共有できますが、オブジェクトを割り当てた dll が割り当てを解除する必要があります。ヒープの破損を避けるために、メンバー データ/オブジェクトを同様に割り当て/再割り当て/割り当て解除するオブジェクトのメソッドを管理する必要があります。非インライン参照カウント/共有ポインターが役立ちます。または、共有メモリ アロケータも役立ちます。

于 2009-10-13T15:44:41.137 に答える
0

関連する可能性のあるフォーラムの投稿を次に示します。これが問題かどうかはわかりませんが、確認する価値があるようです。

要約すると、MS は自動更新によって VS 2005 開発者マシン上の ATL、CRT、MFC、およびその他のいくつかのライブラリを更新しました。

VS2005 がインストールされていないマシンでは、自動更新によって ATL のみが更新され、SxS エラーが発生しました。

開発マシンで更新プログラムをアンインストールするか、実行しようとしているマシンでランタイムを手動でアップグレードできます。詳細は投稿にて。

于 2009-10-13T16:13:28.013 に答える