【问题标题】:What are the advantages of using precompiled static library over directly including it's source code?与直接包含它的源代码相比,使用预编译的静态库有什么优势?
【发布时间】:2013-02-13 09:49:24
【问题描述】:

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

还有一些参考资料将不胜感激。

更新:当我们不得不在我们的项目中包含小型 3rd 方开源库时出现了这个问题。一位开发人员声明,包含预编译的静态库(而不仅仅是复制源文件)将提高应用程序的性能。我看不出为什么会这样。

所以问题是:包含预编译库真的会提高最终应用程序的性能吗?

【问题讨论】:

    标签: ios llvm static-linking


    【解决方案1】:

    如果您谈论的是第三方库,它们的一些优势是:无需发布源代码,(可能)为最终开发人员更简单的安装......虽然有时结果是 更多 很麻烦,特别是如果它没有正确完成(在没有修复符号的情况下链接其他开源项目,支持错误的架构)。

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

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

    编辑:

    具体解决 .o 与 .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 与 .a 的相同二进制文件。

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

    【讨论】:

    • 我同意这个答案太多,无法回答自己。但只是想补充一点,这实际上取决于您是谁以及该项目的用途。拥有自己的东西,你拥有源代码并且不必担心共享,那么静态库是毫无意义的,只是额外的工作没有回报。如果您打算发布给其他人,那么它们非常适合保护您的源代码。预编译并可以使用。
    • 我更新了问题以更好地显示它的上下文。据我了解,静态库或多或少是编译器的原始输出,因此在链接阶段,它是链接静态库还是编译器生成的 .o 文件应该没有区别。
    猜你喜欢
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 2014-10-01
    • 1970-01-01
    相关资源
    最近更新 更多