我正在编写一个 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/