さまざまなライブラリがランタイムライブラリのどのバージョンを使用するかについて合意していないため、VC ++リンカーが不平を言ったり、口を閉ざしたりすることで、私は大人の人生のすべてに苦しんでいるようです。私はその悲惨な主題をマスターする気分には決してなりません。だから私はそれがうまくいくまでそれをいじろうとします。エラーメッセージは決して役に立ちません。この件に関するMicrosoftのドキュメントもそうではありません-少なくとも私にとってはそうではありません。
時々それは関数を見つけられません-名前マングリングが期待されたものではないので?時々それは混ぜ合わせることを拒否します。また、「LINK:警告LNK4098:defaultlib'LIBCMTD'は他のライブラリの使用と競合します。/NODEFAULTLIB:libraryを使用してください」と だけ表示されることもあります。/NODEFAULTLIBの使用は機能しませんが、警告は無害のようです。とにかく「DEFAULTLIB」とは一体何ですか?リンカーはどのように決定しますか?どのランタイムライブラリを使用するかをリンカに指定する方法を見たことがありません。関数呼び出しを作成するライブラリをコンパイラに指示する方法だけです。
オブジェクトファイルを検査して、それらが依存しているDLLを確認できる「依存関係ウォーカー」プログラムがあります。構築しようとしているプロジェクトで1つ実行しただけですが、これは非常に混乱しています。競合するランタイムバージョンが必要なシステム.libsと.dllがあります。たとえば、COMCTL32.DLLはMSVCRT.DLLを必要としていますが、MSVCRTD.DLLとリンクしています。入力しているときでも、COMCTL32D.DLLがあるかどうかを検索しています。
だから私が求めているのは、それらを整理する方法のチュートリアルだと思います。あなたは何をしますか、そしてどのようにそれをしますか?
これが私が知っていると思うことです。これのいずれかが間違っている場合は私を訂正してください。
パラメータは、デバッグ/リリース、マルチスレッド/シングルスレッド、および静的/DLLです。8つの可能な組み合わせのうち6つだけがカバーされています。デバッグでもリリースでも、シングルスレッドのDLLはありません。
設定は、リンクされるランタイムライブラリ(およびそれにリンクするための呼び出し規約)にのみ影響します。たとえば、DLLをビルドする場合は、DLLベースのランタイムを使用する必要はありません。また、プログラムのデバッグバージョンをビルドするときにランタイムのデバッグバージョンを使用する必要もありません。過去のシステムコールをステップ実行します。
ボーナスの質問:誰かまたはどの会社もそのような混乱をどのように作り出すことができますか?