2017-12-26 23 views
2

私の職場では、私たちの製品は実行可能ファイルにコンパイルされ、静的ライブラリ(.lib)または共有ライブラリ(.dll)としてリンクされています。私たちはMicrosoft C++コンパイラを使用します。.o(オブジェクトファイル)が.lib(静的ライブラリ)より速くリンクするのはなぜですか?

私の同僚の一人は、サブプロジェクトのターゲットを.lib(static-library)から.o(オブジェクトファイル)に変換し、そのサブプロジェクトのリンク時間が大幅に減少しました。以前、.libはリンクに約1.5分かかるでしょう。 .oにリンクすると、リンク時間はほぼ5-6秒です。

なぜ.libのリンクが遅くなるのですか?

+1

興味深いトピックです。私の推測では、オブジェクトファイルはリンカのための便利な形式で、それによって期待される構造で既に存在するからです。 –

+2

うーん、それは分かりやすいことではありません。.objファイルは、単一のソースコードファイルのコードだけを格納できます。リンカーは簡単にばかげたことではなく、おそらくそれをまだライブラリとして認識しているでしょう。おそらく、リンクの高価な部分である傾向のある.pdbファイルのデバッグ情報の生成を駄目にするでしょう。あなたがそれをデバッグする必要があるいつか、かなり不愉快な驚きを作り出すべきです。 VS2015 Update 1以降で利用可能な/ DEBUG:fastlinkオプションを見てください。もちろん、コードを別のモジュールDLLにスピンオフすると、ビルド時間が大幅に短縮されます。 –

答えて

-1

あなたがしているのは、オブジェクトファイルを作成するためのソースコードをコンパイルするだけでは、リンクを一切実行していないということです。つまり、ソースコードに存在する外部関数や変数への参照は、そのアドレスがまだ解決されていないため機能しません。

https://www.cprogramming.com/compilingandlinking.html