私はオライリーの本21st Century Cを読んでいます。この著者は、静的ライブラリにリンクするときに次のように述べています。
コンパイラは、ライブラリの関連コンテンツを最終的な実行可能ファイルに[効果的に]コピーしています。
このモジュールで構成される独自の静的ライブラリを作成して、これをテストしようとしました。
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;
}
single_func()
テストのために、1 つは を呼び出し、もう1 つはfunc0()
andを呼び出す 2 つの C ファイルを作成しましfunc1()
た。
結果として得られる実行可能ファイルは、どちらの場合も 751290B です。モジュールから直接呼び出すstrcpy
とstrcat
、両方の実行可能ファイルが 7215B になります。
これは上記のステートメントと矛盾しませんか、それともリンクに関する詳細が欠けていますか?
関連する質問として、スタティック ライブラリは 1600B ですが、このサイズの増加はどこから来るのでしょうか?
追加:
どちらのメイン ファイルも、次のように、関数を呼び出して結果を出力するだけで構成されています。
メイン0:
#include <stdio.h>
#include "sharedlib.h"
int main() {
char* szStr = single_func();
printf("%s", szStr);
return 0;
}
メイン1:
#include <stdio.h>
#include "sharedlib.h"
int main() {
char* szStr;
func0();
szStr = func1();
printf("%s", szStr);
return 0;
}
ファイルは次のようにコンパイルされました。
gcc -static main0.c -L. -lsharedlib -o main0
プラットフォームは Linux で、コンパイラは gcc v4.6.3 です。