obj 和 bin 文件夹(由 Visual Studio 创建)用于啥?

Posted

技术标签:

【中文标题】obj 和 bin 文件夹(由 Visual Studio 创建)用于啥?【英文标题】:What are the obj and bin folders (created by Visual Studio) used for?obj 和 bin 文件夹(由 Visual Studio 创建)用于什么? 【发布时间】:2011-07-15 13:48:32 【问题描述】:

我在 Visual Studio 2010 中创建了一个新项目,并注意到我的项目目录中现在有两个名为 objbin 的新文件夹。

在构建和调试时会创建一对类似的文件夹 - 这些文件夹有什么用?

【问题讨论】:

【参考方案1】:

obj 文件夹包含对象或中间文件,它们是尚未链接的已编译二进制文件。它们本质上是片段,它们将被组合以产生最终的可执行文件。编译器为每个源文件生成一个目标文件,并将这些文件放入obj 文件夹中。

bin 文件夹包含 二进制文件,它们是您的应用程序或库的实际可执行代码。

这些文件夹中的每一个都进一步细分为DebugRelease 文件夹,它们仅对应于项目的构建配置。上面讨论的两种类型的文件都放置在适当的文件夹中,具体取决于您执行的构建类型。这使您可以轻松确定哪些可执行文件是使用调试符号构建的,哪些是启用优化并准备发布的。

请注意,您可以在项目的“属性”中更改编译期间 Visual Studio 输出可执行文件的位置。您还可以更改构建配置的名称和选定选项。

【讨论】:

无论出于何种原因,我的项目都没有 obj 和 bin 文件夹的调试或发布子文件夹。如果我根据当前选择的配置编辑我的项目设置以构建到调试/发布子文件夹,我会收到一个错误,即在调试我的应用程序时无法创建数据类型。我的应用程序只在 bin 文件夹中查找 dll,从不知道在调试或发布文件夹中查找。我该如何纠正这个问题? @Sly 我不明白你在问什么。项目构建应用程序 (EXE) 或库 (DLL)。它不能同时构建两者。因此,如果您的项目创建了一个应用程序,它不会将任何 DLL 放入您的 bin 文件夹中。如果您的项目构建了一个库,当您尝试调试它时会出现错误,因为您无法执行 DLL。无论如何,听起来您已经更改了项目属性中的默认输出路径。如果您需要更多帮助,请提出一个新问题。请务必妥善记录问题,必要时包括项目配置的屏幕截图。 我想知道是否可以在构建完成后强制 Visual Studio 删除 obj 文件夹? @SlyRaskal 您可能没有 Debug/Release 文件夹的一个原因是您是否正在开发 Web 项目? obj 真的只包含 unlinked 目标代码文件吗?根据我的经验,它包含所有个文件,并且在最后的构建步骤中,属于“最终集”的文件被复制bin【参考方案2】:

我建议您观看此 youtube 视频,该视频演示了 C# bin and obj folders 之间的区别,并解释了我们如何获得增量/条件编译的好处。

C#编译是一个两步的过程,更多细节见下图:

    编译:在编译阶段,单独的 C# 代码文件被编译成单独的编译单元。这些单独的编译代码文件位于 OBJ 目录中。 链接:在链接阶段,这些单独的编译代码文件被链接以创建单个单元 DLL 和 EXE。这在 BIN 目录中。

如果你比较 bin 和 obj 目录,你会发现“obj”目录中有更多的文件,因为它有单独的编译代码文件,而“bin”只有一个单元。

【讨论】:

我尝试使用 VS 2017 和 .net 4.7 编译 C# 控制台应用程序和 WPF 应用程序。在这两种情况下,我都找不到“单个编译单元”,即与源文件具有 1-1 关系的对象。似乎只有 xaml 文件会为每个源文件生成中间文件。也许在较新版本的.net中有所改变?也许我错过了什么?也许这就是 c++ 的工作方式,没有人真正检查这些文件并发现它不是那样工作的?【参考方案3】:

obj 目录用于存放由编译器或构建系统在构建期间生成的中间目标文件和其他临时数据文件。 bin 目录是最终输出二进制文件(以及任何依赖项或其他可部署文件)将被写入的目录。

如果您愿意,您可以在项目设置中更改用于这两个目的的实际目录。

【讨论】:

“bin”可以在项目属性->“构建”->“输出”->“输出路径”中更改。但是“obj”呢?【参考方案4】:

关于 obj 目录的一个有趣事实:如果您在 Web 项目中设置了发布,那么将要发布的文件将暂存到 obj\Release\Package\PackageTmp。如果您想自己发布文件而不是使用集成的 VS 功能,您可以在此处抓取您实际需要部署的文件,而不是从 bin 目录中的所有数字碎片中挑选。

【讨论】:

【参考方案5】:

如果您正在使用setup 项目,请注意它们; Visual Studio 设置项目 Primary Outputobj 文件夹而不是 bin 中提取。

我发布了我认为被混淆并在msi 设置中签名的应用程序很长一段时间,然后我发现部署的应用程序文件实际上既没有混淆也没有签名,因为我在bin 上执行构建后过程文件夹程序集,并且应该以 obj 文件夹程序集为目标。

这远非直观的恕我直言,但一般的setup 方法是使用项目的Primary Output,这是obj 文件夹。如果有人能对此有所了解,我会很高兴的。

【讨论】:

以上是关于obj 和 bin 文件夹(由 Visual Studio 创建)用于啥?的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2017 - Xamarin - 文件“obj\Debug\android\bin\packaged_resources”不存在

Visual Studio Mac:不支持在其他地方输出obj / bin文件夹?

如何从 Visual C++ 的 .obj 文件构建静态和动态库?

.LIB 和 .OBJ 文件有啥区别? (Visual Studio C++)

Xamarin.iOS 在 Visual Studio 2019、2022 中找不到配置文件

在 Visual Studio 2010 中构建时锁定文件