これは私が盲目的に受け入れて、「それは方法」として続いています。私はそれの背後にある "なぜ"をより深く理解しようとしています。Visual Studio C-ランタイムライブラリのリンク動作の深い理解を求める
- 静的ライブラリLIBA - は、いくつかのCランタイムは
- 静的ライブラリLibBを呼び出しutulizes - いくつかのCランタイムが実行可能なアプリケーション
- を呼び出して利用 - LIBA、LibBを利用し、いくつかのCランタイムがそれ
を呼び出しますhereと、リンカの呼び出しに渡されたすべてのモジュールが同じランタイムライブラリコンパイラオプションでコンパイルされていなければならない場所がたくさんあります。
hereとhereを議論したように、すべてのシンボルの解像度がAppの最後のリンクの間に実行されている場合は、なぜこれがそうですか? LibAとLibBは、ビルド時に使用する特定のランタイムライブラリを指定する必要があるのはなぜですか? Cランタイムコールは、ランタイムAppがそのリンクに指定したものに対してただ解決するべきではありませんか?
これは他のC開発環境の問題でも、Visual Studio固有の問題ですか?
CRTはちょうどそれがグローバルな状態をたくさん持っている、モジュールの概念と非常に互換性がありません。 errnoのような変数は良い例です。 EXEとDLLの間でその状態を共有できるようにするには、errnoの定義をハックして関数呼び出しにする必要があります。したがって、1つの共有値しか得られません。/MDによってトリガーされます。 errnoを参照する.objを_errno()を参照する別のものにリンクしようとすると動作しません。完全に正確ではなく、問題の代表的ではありません。 –