使用预编译静态库而不是直接包含它的源代码有什么好处?

时间:2013-02-13 09:49:24

标签: ios llvm static-linking

我能想到的唯一优势就是编译速度。两种情况下的最终结果(二进制大小和速度)应该相同(当然,除非编译静态库而没有优化)。

另外一些参考文献将不胜感激。

更新:当我们在项目中包含小型第三方开源库时,就出现了这个问题。一位开发人员发表声明称,包含预编译的静态库(而不仅仅是复制源文件)会提高App的性能。我认为没有理由这样做。

所以问题是:包含预编译库是否真的能提高最终App的性能?

1 个答案:

答案 0 :(得分:3)

如果您正在谈论第三方库,那么它们的一些优点是:无需为最终开发人员发布源代码,(可能)更简单的安装......尽管有时候它会变成更多< / em>麻烦,特别是如果它没有做好(在其他开源项目中链接而不修复符号,支持错误的架构)。

如果你的意思是你自己的代码 - 似乎你只是为自己制造麻烦。如果文件没有改变,它们将在磁盘上编译(.o),除非你进行全部清理/重建,否则编译器不需要重建它们。所以你可能不会获得编译速度。

无论哪种方式 - 是的,输出应该是相同的。静态链接库只是您直接链接到的相同.o文件的集合。

编辑:

具体解决.o vs .a - .a的速度只是.o文件的集合,便于在开发过程中进行打包。链接后,结果是相同的。我刚做了一个快速的健全测试来验证:

$ cat a.c
#include <stdio.h>

extern char *something();

int main()
{
    printf("%s", something());
    return 0;
}
$ cat b.c
char *something()
{
    return "something fancy here\n";    
}

$ gcc -c -o a.o a.c
$ gcc -c -o b.o b.c
$ gcc -o foo1 a.o b.o
$ ar -r b.a b.o
ar: creating archive b.a
$ gcc -o foo2 a.o b.a
$ cmp foo1 foo2

你有它,相同的二进制文件链接.o vs .a。

如果您使用动态库而不是静态库,则会有轻微的性能 hit (我相信只有在查找符号时)。也许这就是其他开发人员所指的,静态库比动态库稍快一些。