【问题标题】:static library, but I still need headers?静态库,但我仍然需要标题?
【发布时间】:2011-02-06 09:49:06
【问题描述】:

我有一堆项目,它们都可以共享一个“通用”静态类库。

让我感到困惑的是,如果我从这些类中创建一个静态库并在我的项目中链接它,我仍然需要在我的主要项目中静态库中的类的标题。

那么静态库有什么好处呢?

像 Adob​​e 这样的公司如何处理这个问题?

【问题讨论】:

    标签: c++ linker static-libraries


    【解决方案1】:

    静态库允许您创建库并在许多项目中使用该库。

    需要头文件:

    由于使用该库的项目是独立于该库进行编程和编译的,因此该程序需要知道您正在使用的东西的声明。否则你的编译器怎么知道你正在编写有效的代码?

    编译器只将源代码作为输入并产生输出。它不处理输入时编译的目标文件或静态库。

    需要在库中进行链接:

    因此,拥有标头可以让您在项目中编写有效代码,但在链接时间方面,您需要提供包含在静态库中的定义。

    链接器获取所有目标文件(编译代码)以及所有静态库并生成可执行文件或二进制文件。

    有关静态库的更多信息(优点、比较动态等...):

    除其他外,最好将您的项目分成库,这样您就不会得到 1 个巨大的单体项目。

    您不需要以这种方式分发源代码(通常在 .cpp 文件中)。

    如果您只是在每个使用公共库的项目中包含所有 .cpp 文件,那么您每次都必须编译 .cpp 文件。

    静态库优于动态库的一个优势是,您始终可以确保您的程序是自包含的,并且它们使用的是正确版本的库(因为它们被编译成可执行文件本身)。与动态链接相比,您还将获得轻微的速度优势。

    静态库相对于动态库的缺点包括您的文件会更大,因为每个可执行文件都需要自己的副本,而且您不能换出不同版本的库,因为它不是动态加载的。

    你的问题:公司如何处理这个问题:

    典型的公司会广泛使用静态库和动态库。

    【讨论】:

    • @Brian - 明白了。您有 OS X 上的动态库的参考资料吗?
    • 这两种库的另一个好处:减少编译时间。
    • developer.apple.com/Mac/library/documentation/DeveloperTools/… 而且,如果您在谈论 OS X,您可能想要研究构建一个框架,这(基本上)是一种将库和相应标头打包在一起的方式
    • 如果我错了,请纠正我,动态共享库 .so 不需要正确的标题,不像静态库 .a
    【解决方案2】:

    使用静态库的典型方法是在 Makefile(或您使用的任何构建系统)中设置一个目标,在安装库的同时将标头安装到适当的位置。

    因此,您的静态库最终位于 /usr/local/lib 中,并且标头进入 /usr/local/include 或其他任何位置。

    【讨论】:

      【解决方案3】:

      此外,与链接目标文件相比,链接静态库可能会导致最终可执行文件更小。这样做的原因是,如果您不从特定目标文件(包含在静态库中)调用任何函数,链接器将不会在您的最终可执行文件中包含这些函数的代码。见Extraneous Library Linkage

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-14
        • 1970-01-01
        • 1970-01-01
        • 2017-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多