我能想到的唯一优势是编译速度。在这两种情况下的最终结果(二进制大小和速度)应该是相同的(当然,除非静态库没有经过优化编译)。使用预编译静态库直接包含源代码的优点是什么?
还有一些参考将不胜感激。
更新:当我们不得不在我们的项目中包含小型第三方开源库时,出现了这个问题。一位开发人员声明,包括预编译静态库(而不是仅复制源文件)会提高应用程序的性能。我没有看到为什么会出现这种情况。
所以问题是:包含预编译的库真的会提高最终应用程序的性能吗?
我能想到的唯一优势是编译速度。在这两种情况下的最终结果(二进制大小和速度)应该是相同的(当然,除非静态库没有经过优化编译)。使用预编译静态库直接包含源代码的优点是什么?
还有一些参考将不胜感激。
更新:当我们不得不在我们的项目中包含小型第三方开源库时,出现了这个问题。一位开发人员声明,包括预编译静态库(而不是仅复制源文件)会提高应用程序的性能。我没有看到为什么会出现这种情况。
所以问题是:包含预编译的库真的会提高最终应用程序的性能吗?
如果你在谈论第三方库,它们的一些优点是:不需要发布源代码,(对于最终开发者来说可能)更简单的安装......虽然有时会变成更多一个麻烦,特别是如果它没有做好(在没有修复符号的情况下链接到其他开源项目,支持错误的体系结构)。
如果你的意思只是你自己的代码 - 似乎你只是为自己制造麻烦。如果这些文件没有改变,它们将被编译到磁盘上(.o),编译器将不需要重新编译它们,除非你进行清理/重新编译。所以你可能无法获得编译速度。
无论哪种方式 - 是的,输出应该是相同的。一个静态链接的库仅仅是你将直接链接到的相同.o文件的集合。
编辑:
的.o VS .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与.a。
有一个轻微的性能命中如果您使用动态库,而不是静态库(我相信只有当查找符号时)。也许这就是其他开发者所指的,静态库比动态库要快一些。
我同意太多这个答案来回答我自己。但只是想补充一点,这要看你是谁,项目是什么。拥有自己的东西,你拥有源代码并且不必担心共享,然后静态库是毫无意义的,只是额外的工作,没有回报。如果您打算发布给其他人,那么它们对于保护您的源代码非常有用。预编译并准备使用。 – 2013-02-14 16:00:59
我已更新问题以更好地显示它的上下文。据我了解,静态库或多或少是编译器的原始输出,因此在链接阶段,它应该与由编译器生成的静态库或.o文件进行链接。 – DexM 2013-02-15 12:00:17
已更新的答案以解决您更新的问题。 – escrafford 2013-02-15 17:37:07