我们来看这样一个问题:a.out/libTest.so静态链接了libme.a, 为什么存在于libme.a中的符号没有在a.out/libTest.so中出现? 为了方便讨论, 我们只说a.out和libme.a.
我们知道, 静态库完全等价于目标文件(它们可逆), 当然, 这里很可能是众多目标文件.o . 而可执行文件a.out在链接libme.a时, 首先会对libme.a进行解压, 形成众多的目标文件.o, 然后根据需要来链接需要的文件, 并不是链接所有目标文件, 也没有这个必要。
下面, 我们来验证一把, 先看看源文件:
taoge@localhost Desktop> cat test1.c
#include <stdio.h>
void fun1()
{
printf("function1 is called");
}
taoge@localhost Desktop> cat test2.c
#include <stdio.h>
void fun2()
{
printf("function2 is called");
}
taoge@localhost Desktop> cat main.c
void fun1();
void fun2();
int main()
{
fun1();
return 0;
}
taoge@localhost Desktop>
编译并运行一把:
taoge@localhost Desktop> gcc test1.c test2.c -c
taoge@localhost Desktop> ar rcs libme.a test1.o test2.o
taoge@localhost Desktop> gcc main.c -L./ -lme
taoge@localhost Desktop> ./a.out
function1 is called
用stings来验证一把:
taoge@localhost Desktop> strings libme.a | grep fun
fun1
fun2
function1 is called
fun1
function2 is called
fun2
taoge@localhost Desktop> strings a.out | grep fun
function1 is called
taoge@localhost Desktop>
可见, fun2存在与libme.a的符号表中, 但不存在于a.out的符号表中, 上面已经说了原因。 这样做是有好处的, 省空间, 是时间。