私はO'Reillyの本21st Century Cを読んでいます。著者は、静的ライブラリ「コンパイラは、ライブラリの関連するコンテンツを最終的な実行可能ファイルにコピーしている」と述べています。 (1が(single_funcを呼び出しているCファイル)や他の呼のfunc0に作成されたテストのために静的ライブラリとのリンク時にオブジェクトコードを実行可能ファイルにコピーする方法は?
static char szStr[64];
char* single_func() {
strcpy(szStr, "Hello string!\r\n");
return szStr;
}
void func0() {
strcpy(szStr, "Hello");
}
char* func1() {
strcat(szStr, " string!\r\n");
return szStr;
}
)と:
私はこのモジュールからなる自分の静的ライブラリを作成することによってこれをテストしようとしていますfunc1()。
結果の実行可能ファイルはどちらの場合も751290Bです。モジュールからstrcpyとstrcatを直接呼び出すと、両方の実行可能ファイルが7215Bになります。
これは上記の声明と矛盾しないのですか、リンクについての詳細がありませんか?
関連する質問は、静的ライブラリは1600Bなので、このサイズの増加はどこから来るのですか?
追加:
両方メインのファイルはこのように、関数を呼び出し、結果を印刷するよりも何で構成さ:
main0:
#include <stdio.h>
#include "sharedlib.h"
int main() {
char* szStr = single_func();
printf("%s", szStr);
return 0;
}
MAIN1:
のファイルは、次のようにコンパイルされた:
gcc -static main0.c -L. -lsharedlib -o main0
プラットフォームは、Linuxで、コンパイラがGCC v4.6.3です。
私が質問した追加情報で私の質問が更新されましたが、どこに行くのか分かり始めました。 1:ライブラリのオブジェクトファイルから単一の関数を使用する場合、オブジェクトファイル全体が実行可能ファイルにロールインされます。 2:-staticオプションを使用することによって、_all_ライブラリは最終実行ファイルにロールインされ、より大きなファイルサイズが生成されます。私はこれで正しいですか? – Kenneth
はい。あなたは両方の事柄に合っています。 Plaugerの本「The Standard C Library」(C89標準)を見ると、ほとんどのソースファイルには外部から見える関数が1つしかないので、使用しないものを実行可能ファイルにドラッグしないことがわかります。 '-lsharedlib'の後に' -shared'をコマンドラインに追加することによって、実行可能ファイルのサイズを大幅に減らすことができます。 –
Cライブラリが静的にリンクされているように見えるのは少し驚きです。ある時点(おそらく10年前)、私はCライブラリが静的ライブラリとして提供されていないと考えました(したがって、共有する必要がありました)。私は誤解しているかもしれないし、LinuxよりもむしろUnixの変種であったかもしれない。あなたは 'ldd main0'で共有ライブラリとして読み込まれているものを確認することができます。使用された共有オブジェクトがリストされます。 –