c++ - 静态链接库

标签 c++

我正在编写一个 hello world c++ 应用程序,在指令 #include 中帮助编译器或链接器导入 c++ 库。我的 "cout << "hello world"; "使用库中的 cout。问题是编译后生成的exe大约有96k大小,那么这个exe文件中到底包含了哪些指令,这个文件中是否也包含了iostream库?

谢谢

最佳答案

在一般情况下,链接器只会引入它需要的东西。一旦编译器 阶段将您的源代码转换为目标文件,它就会与所有其他目标文件一样被对待。你有:

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

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

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

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

链接器会继续这样,直到所有符号都满足(当它给你一个可执行文件时)或一个不能满足(当它向你提示你的编码实践时)。

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

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

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

并且,根据您添加的评论,代码:

cout << "hello";

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

关于c++ - 静态链接库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2159603/

相关文章:

c++ - 将对成员对象的引用添加到指针数组

c++ - `run` 别名分析llvm中的方法

c++ - Mongodb C++ 驱动程序 - 链接错误:使用已弃用的 boost::stystem::get_generic_category()

c++ - 将在 STL 集上运行的函数泛化到所有集合

c++ - 使用模板将类函数应用于对象 vector

c++ - 如何清除数组中的元素?

c++ - 有效地填补有序数字列表中的第一个空白

c++ - 堆栈与堆属性的 QT 特定差异?

c++ - 在 C++ 中嵌入 lua 的问题

c++ - 如何在 Clang 中使用 C++ 11 功能?