【发布时间】:2012-10-09 13:56:14
【问题描述】:
我正在阅读 O'Reilly 的书 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;
}
为了测试,我创建了两个 C 文件,其中一个调用 single_func(),另一个调用 func0() 和 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:
#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。
【问题讨论】:
标签: c linker static-libraries