【问题标题】:static link library静态链接库
【发布时间】:2010-01-29 02:56:37
【问题描述】:

我正在编写一个hello world c++ 应用程序,在#include 指令中帮助编译器或链接器导入c++ 库。我的 " cout

谢谢

【问题讨论】:

  • 什么编译器?什么操作系统?编译器和链接器有哪些选项?
  • cl.exe /EHsc hello.cpp 它是vc编译器。 96kbyte 仍然很大,考虑到我只有两个语句, cout
  • 应该有人给他那个平台上反汇编器的命令。

标签: c++


【解决方案1】:

在一般情况下,链接器只会引入它需要的东西。一旦 编译器 阶段将您的源代码转换为目标文件,它的处理方式与所有其他目标文件大致相同。你有:

  • 准备执行环境(设置 argv、argv 等)的 C 启动代码然后调用您的 main 或等效项。
  • 您的代码本身。
  • 需要从库中拖入任何目标文件(动态链接是在运行时发生的链接的一种特殊情况,由于您专门询问了静态链接,因此我不会在这里介绍)。

链接器将包含您明确指定的所有目标文件(除非它是一个特别智能的链接器并且可以告诉您没有使用目标文件)。

对于库,情况略有不同。基本上,您从未解析的符号列表开始(如cout)。链接器将搜索您指定的所有库中的所有目标文件,当它找到满足该符号的目标文件时,它会将其拖入并修复符号引用。

当然,这可能会添加 更多 个未解析的符号,例如,如果目标文件中有依赖于 C printf 函数的内容(不太可能但可能)。 p>

链接器继续这样,直到所有符号都满足(当它为您提供可执行文件时)或无法满足(当它向您抱怨您的编码实践时)。

至于可执行文件中的内容,它可能是整个 iostream 库,也可能只是执行您所要求的最低要求。这通常取决于 iostream 库内置了多少目标文件。

我见过将整个子系统放入一个目标文件的代码,因此,如果您只想使用一小部分,您仍然可以得到很多。或者,您可以将每个函数放入其自己的目标文件中,链接器可能会创建一个尽可能小的可执行文件。

链接器有一些选项可以生成链接图,向您展示事物的组织方式。如果您使用的是 IDE,您可能通常不会看到它,但它会隐藏在 MSVC 下的编译时选项对话框中。

并且,就您添加的评论而言,代码:

cout << "hello";

很可能会引入相当大的 iostream 字符串处理代码块。

【讨论】:

    【解决方案2】:

    使用cl /EHsc hello.cpp -link /MAP。生成的 .map 文件将让您大致了解 .exe 中存在哪些静态库。

    【讨论】:

      【解决方案3】:

      C++ 启动代码和您使用的静态库部分使用了一些空间。

      【讨论】:

      • 你的意思是整个iostream库都合并到生成的exe里面了?
      • @stone,一般来说,链接器足够聪明,只包含代码实际使用的部分。
      • 我见过的大多数链接器(老式的 UNIX)只进入库中的对象文件级别(如果该对象满足符号,则整个对象都进来)。但我想我读过一次MSVC(至少)可以进入对象并且只提取它需要的东西。我不确定。
      • @paxdiablo,我在这方面的大部分经验都是在嵌入式领域——也许桌面链接器不太关心可执行文件的大小:)
      【解决方案4】:

      在windows中,库或部分库(使用的)通常也包含在.exe中,在Linux情况下情况不同。但是,有一些优化选项。 我想这个 Wiki 链接会很有用:Static Libraries

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多