我们知道当程序链接一个静态库的时候程序不会把所有的函数都加载进来,而是按需加载,最小单位是一个.o文件
其实道理很简单,链接本身就是这么做的多余的不会参与进来,不会让可执行文件变得更大!
例子(测试环境在Linux下):
有如下文件:
//f1.c
void f1_run1(void)
{
}
void f1_run2(void)
{
}
//f2.c
void f2_run1(void)
{
}
void f2_run2(void)
{
}
//main
void f1_run1(void);
void f1_run2(void);
void f2_run1(void);
void f2_run2(void);
int main(int argc, char **argv)
{
f1_run1();
return 0;
}
编译main.c 并链接libf.a,并用nm工具查看生成的a.out文件里面的符号表是怎样的:
我们可以看到只有f1.c中的函数在加载到a.out中了,可见是按o文件加载的,并且是按需加载.