我知道编译时包含在可执行文件中的代码可以来自目标文件(.o文件)和静态链接库(.lib / .a文件).从根本上和概念上讲这两者之间的区别是什么?为什么“目标代码”和“静态链接库”之间存在不同的概念?每种方法的优点和缺点是什么,为什么使用一种而不是另一种?可以从目标文件中创建静态链接库,反之亦然,可以从静态链接库中创建目标文件吗?
解决方法
目标文件是编译但未链接的代码.库包含目标文件.因此,你的问题变成了,“如果我只能使用目标文件,为什么要使用静态链接的库?”这就是原因.
与一组对象(每个对象都有自己的符号表)不同,库有一个统一的符号表,当库开发人员使用s开关调用ar时创建该符号表. s调用ranlib为该存档中的所有对象创建统一符号表.
Generate an index to speed access to archives.
从通用ranlib docs:
An archive with such an index speeds up linking to the library and
allows routines in the library to call each other without regard to
their placement in the archive. T
另见FreeBSD ranlib docs – 不同的措辞,相同的想法:联系速度.