我在Visual Studio 2010中创建了一个新项目,并注意到在我的项目目录下现在有两个名为obj
和bin
的新文件夹。
在构建和调试期间会创建一对类似的文件夹 - 这些文件夹是用来做什么的?
我在Visual Studio 2010中创建了一个新项目,并注意到在我的项目目录下现在有两个名为obj
和bin
的新文件夹。
在构建和调试期间会创建一对类似的文件夹 - 这些文件夹是用来做什么的?
obj
文件夹保存着对象或中间文件,这些编译后的二进制文件尚未链接。它们实际上是碎片,将被组合生成最终的可执行文件。编译器为每个源文件生成一个对象文件,并将这些文件放置到obj
文件夹中。
bin
文件夹保存二进制文件,这些是应用程序或库的实际可执行代码。
这两个文件夹都进一步分为Debug
和Release
文件夹,这仅对应于项目的构建配置。根据执行的构建类型,这两种文件讨论以上会被放入相应的文件夹中。这使您可以轻松确定哪些可执行文件是使用调试符号构建的,哪些是启用优化并准备发布的。
请注意,在编译时,您可以更改Visual Studio输出可执行文件的位置,即在项目的“属性”中进行设置。您还可以更改构建配置的名称和选定的选项。
如果你比较"bin"和"obj"目录,你会发现"obj"目录中的文件数更多,因为它包含了单独编译的代码文件,而"bin"只有一个单元。
obj
目录用于存放编译器或构建系统在构建过程中生成的中间对象文件和其他临时数据文件。而bin
目录则是最终输出二进制文件(以及任何依赖项或其他可部署文件)的目录。
如果需要,您可以在项目设置中更改用于这两个目的的实际目录。
关于obj目录的一个有趣事实:如果您在Web项目中设置了发布,将要发布的文件将被暂存到obj\Release\Package\PackageTmp目录下。如果您想自己发布文件而不使用集成的VS功能,您可以在这里获取您实际需要部署的文件,而不必在bin目录中挑选所有的数字垃圾。
从更高的层面来理解这个问题会更好:编译
和链接
,这不仅适用于c#
语言,还适用于许多其他语言。
编译
- 修改后的源代码被编译成二进制目标代码。这段代码还不能执行。
链接
- 将目标代码与所需的支持代码组合起来,生成可执行程序。这一步通常涉及添加任何所需的库。
具体来说,对于.net
案例,obj
(对象)文件夹包含编译
阶段的输出。而bin
(二进制)文件夹包含链接器的输出。