12

さまざまなライブラリがランタイムライブラリのどのバージョンを使用するかについて合意していないため、VC ++リンカーが不平を言ったり、口を閉ざしたりすることで、私は大人の人生のすべてに苦しんでいるようです。私はその悲惨な主題をマスターする気分には決してなりません。だから私はそれがうまくいくまでそれをいじろうとします。エラーメッセージは決して役に立ちません。この件に関するMicrosoftのドキュメントもそうではありません-少なくとも私にとってはそうではありません。

時々それは関数を見つけられません-名前マングリングが期待されたものではないので?時々それは混ぜ合わせることを拒否します。また、「LINK:警告LNK4098:defaultlib'LIBCMTD'は他のライブラリの使用と競合します。/NODEFAULTLIB:libraryを使用してください」と だけ表示されることもあります。/NODEFAULTLIBの使用は機能しませんが、警告は無害のようです。とにかく「DEFAULTLIB」とは一体何ですか?リンカーはどのように決定しますか?どのランタイムライブラリを使用するかをリンカに指定する方法を見たことがありません。関数呼び出しを作成するライブラリをコンパイラに指示する方法だけです。

オブジェクトファイルを検査して、それらが依存しているDLLを確認できる「依存関係ウォーカー」プログラムがあります。構築しようとしているプロジェクトで1つ実行しただけですが、これは非常に混乱しています。競合するランタイムバージョンが必要なシステム.libsと.dllがあります。たとえば、COMCTL32.DLLはMSVCRT.DLLを必要としていますが、MSVCRTD.DLLとリンクしています。入力しているときでも、COMCTL32D.DLLがあるかどうかを検索しています。

だから私が求めているのは、それらを整理する方法のチュートリアルだと思います。あなたは何をしますか、そしてどのようにそれをしますか?

これが私が知っていると思うことです。これのいずれかが間違っている場合は私を訂正してください。

  1. パラメータは、デバッグ/リリース、マルチスレッド/シングルスレッド、および静的/DLLです。8つの可能な組み合わせのうち6つだけがカバーされています。デバッグでもリリースでも、シングルスレッドのDLLはありません。

  2. 設定は、リンクされるランタイムライブラリ(およびそれにリンクするための呼び出し規約)にのみ影響します。たとえば、DLLをビルドする場合は、DLLベースのランタイムを使用する必要はありません。また、プログラムのデバッグバージョンをビルドするときにランタイムのデバッグバージョンを使用する必要もありません。過去のシステムコールをステップ実行します。

ボーナスの質問:誰かまたはどの会社もそのような混乱をどのように作り出すことができますか?

4

1 に答える 1

3

あなたのポイント(1)と(2)は私には正しいように見えます。(2)で注意すべきもう1つの点は、デバッグCRTでリンクすると、拡張ヒープチェック、チェック済みイテレーター、その他のさまざまな健全性チェックなどにアクセスできることです。アプリケーションでデバッグCRTを再配布することはできませんが、リリースビルドのみを使用して出荷する必要があります。VCライセンスで必要なだけでなく、とにかくデバッグバイナリを出荷したくないでしょう。

のようなものはありませんCOMCTL32D.DLL。Windowsの一部であるDLLは、Windowsのビルド時にリンクされていたCRTをロードする必要があります。これはOSにとして含まれていMSVCRT.DLLます。MSVCRT.DLLこのWindowsCRTは、プログラムを構成するモジュール( Windowsに付属しているモジュールです。VCCRTにはバージョン番号などが含まれます)によって読み込まれるVisual C++CRTから完全に独立していますMSVCRT80.DLL。プログラムを構成するEXEファイルとDLLファイルのみがデバッグ/リリースのマルチスレッド/シングルスレッド設定の影響を受けます。

ここでのIMOのベストプラクティスは、CRTの設定を選択し、出荷するすべてのバイナリに対してそれを標準化することです。私は個人的にマルチスレッドDLLランタイムを使用します。これは、MicrosoftがWindows Updateを介してプッシュできるCRTにセキュリティ更新プログラムとバグ修正を発行できる(そして発行している)ためです。

于 2010-03-02T01:44:10.703 に答える