4

libfooクラス、いくつかの静的変数、おそらく「C」リンケージを持つもの、および他のいくつかの関数を含むと呼ばれるライブラリがあるとします。

これで、次のようなメインプログラムが作成されました。

int main() {
   return 5+5;
}

これをコンパイルしてリンクすると、に対してリンクしlibfooます。

これは何か効果がありますか?実行可能ファイルのサイズは大きくなりますか?もしそうなら、なぜですか?静的変数またはそのアドレスは実行可能ファイルにコピーされますか?

これと同様の質問がある場合、または私が何らかの形で特に愚かである場合は、お詫び申し上げます。

4

2 に答える 2

6

実行可能ファイルが実際には libfoo のシンボルを使用していないことがわかっているため、最新のリンカーでは何もしません。私のシステムに gcc 4.4.1 と ld 2.20 がある場合:

g++ linker_test.cpp -static -liberty -lm -lz -lXp -lXpm -o linker_test_unnecessary
g++ linker_test.cpp -static -o linker_test_none
ls -l linker_test_unnecessary linker_test_none 

どちらも 626094 バイトです。これは動的リンクにも適用されますが、両方のサイズははるかに小さいことに注意してください。

于 2010-06-03T10:25:40.467 に答える
4

ライブラリには、以前にコンパイルされたオブジェクト コードが含まれています。基本的に、静的ライブラリは .o または .obj ファイルのアーカイブです。

リンカはオブジェクト コードを調べて、未解決の名前があるかどうかを確認し、未解決の名前がある場合はライブラリで検索します。見つかった場合は、それらを含むオブジェクト ファイルをインクルードし、これを繰り返します。

したがって、スタティック ライブラリの必要な部分だけが実行可能ファイルに含まれます。

したがって、あなたの場合、libfooからの何も実行可能ファイルに追加されません

于 2010-06-03T10:27:02.713 に答える