我正在编写一个hello world c ++应用程序,在#include指令中帮助编译器或链接器导入c ++库。我的“cout<<”你好世界“;”在图书馆里使用一个cout。问题是在编译之后,生成的exe大小约为96k,所以这个exe文件中实际包含的指令是什么,这个文件是否还包含iostream库?
由于
答案 0 :(得分:4)
在一般情况下,链接器只会引入它所需的内容。一旦编译器阶段将您的源代码转换为目标文件,它就会被视为与所有其他目标文件相同。你有:
main
或同等版本。链接器将包含您明确指定的所有目标文件(除非它是一个特别智能的链接器,并且可以告诉您没有使用目标文件)。
对于图书馆来说,它有点不同。基本上,您从一个未解析的符号列表开始(如cout
)。链接器将搜索您指定的所有库中的所有目标文件,当它找到满足该符号的目标文件时,它将将其拖入并修复符号引用。
当然,这可能会添加甚至更多未解析的符号,例如,如果目标文件中有某些内容依赖于C printf
函数(不太可能但可能)。
链接器继续这样,直到满足所有符号(当它给你一个可执行文件时)或者一个人不能满足时(当它对你的编码实践抱怨时)。
关于您的可执行文件中的内容,它可能是整个iostream库,或者它可能只是执行您所要求的最低要求。它通常取决于iostream库内置的目标文件数量。
我已经看到了整个子系统进入一个目标文件的代码,所以,如果你只想使用一小部分,你仍然可以得到很多。或者,您可以将每个函数放入其自己的目标文件中,链接器可能会创建尽可能小的可执行文件。
链接器有一些选项可以生成一个链接映射,它将显示事物的组织方式。如果您正在使用IDE,您可能通常不会看到它,但它将深深地隐藏在MSVC下的编译时选项对话框中。
而且,就您添加的评论而言,代码为:
cout << "hello";
很可能会带来大量的iostream 和字符串处理代码。
答案 1 :(得分:2)
使用cl /EHsc hello.cpp -link /MAP
。生成的.map文件可以让您大致了解.exe中存在哪些静态库。
答案 2 :(得分:0)
C ++启动代码使用了一些空间,以及您使用的静态库部分。
答案 3 :(得分:0)
在Windows中,库或部分库(使用的)通常也包含在.exe中,在Linux的情况下情况有所不同。但是,有优化选项。 我想这个Wiki链接很有用:Static Libraries