我们来看这样一个问题: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的符号表中, 上面已经说了原因。 这样做是有好处的, 省空间, 是时间。