为什么在Visual Studio中有单独的Debug和Release文件夹?

时间:2010-01-12 15:00:19

标签: visual-studio debugging release

默认情况下,Visual Studio当然会为Debug和Release版本创建单独的bin文件夹。从外部依赖的角度来看,我们遇到了一些小问题,有时候我们需要发布二进制文件,有时候需要调试。它会使生命稍微更容易在所有项目上只有一个bin文件夹,并使其成为Debug和Release的目标。然后我们可以将我们的外部脚本等指向一个位置。

一位同事质疑为什么我们不能这样做 - 将VS项目设置更改为转到同一个bin文件夹?我承认我无法想到保留它们的好理由,除了能够在我的本地文件系统上看到哪些是Debug,哪些是Release。但那是什么;这会带来什么收获?

我的问题:

  • 如何利用具有不同的Debug和Release文件夹?这会在您的开发中实现哪些流程?
  • 如果你没有保留这种区别,会发生什么坏事?
  • 反过来说,如果你已经走了“单一文件夹”的路线,这对你有什么帮助?

我不是在问为什么要有单独的Debug和Release版本。我理解每个人的不同之处和地点。我的问题是将它们放在不同的文件夹中。

10 个答案:

答案 0 :(得分:48)

Dave,如果你将Debug和Release编译到单个文件夹,你可能会遇到这样的情况:从Release转换到Debug之后不会重新编译某些dll-s,反之亦然,因为dll文件比源文件更新。是的,“重建”应该可以帮到你,但是如果你忘了这一点 - 你可以多花些时间进行调试。

答案 1 :(得分:17)

我看到它的方式,这只是开发人员机器的一个便利,允许他们同时编译和运行Debug和Release版本。

如果您在Visual Studio中运行脚本或工具,则IDE允许您使用ConfigurationName和其他宏来获取与配置无关的路径。

如果从命令行外部运行脚本和工具(即您正构建某种类型的发布或部署过程),最好在构建服务器上执行此操作,其中Debug和Release之间的区别走了。

例如,当您从命令行(在构建服务器上)调用msbuild时,您可以为Debug或Release指定Configuration属性,并将OutputPath属性指定为仅构建到一个位置(无论配置如何)。 / p>

答案 2 :(得分:5)

我使用单独文件夹的一个原因是它保证我只生成使用Release-build代码的安装程序。我使用WiX,它允许我指定我想要包含在安装程序中的文件的确切路径,因此我最终在Release文件夹中指定路径。 (当然,您可以使用普通的VS安装程序执行相同操作,因此这不是重点。)如果您在构建之前忘记将项目切换到Release,则除非您在Release中使用旧代码,否则不会构建安装程序文件夹,在这种情况下你最终得到一个旧的安装程序,所以这是一个陷阱。我绕过的方法是在WiX安装程序项目上使用post-build事件,在WiX安装程序构建之后清除release文件夹。

答案 3 :(得分:4)

在之前的公司中,我们通过附加“D”更改调试可执行文件和dll的名称来解决此问题。所以

  

MainProgram.exe& library.dll

成为

  

MainProgramD.exe& libraryD.dll

这意味着它们可以共存于同一个输出文件夹中,所有脚本,路径等都可以引用它。中间文件仍然需要转到单独的文件夹,因为这些文件的名称无法更改。

显然,您需要更改所有引用以指向修改后的调试名称 - 您将在某个时候忘记这样做。

答案 4 :(得分:3)

我通常在Debug模式下编译,但有时需要在Release模式下编译。不幸的是,它们在某些错误情况下的行为并不完全相同。通过使用单独的文件夹,我不需要重新编译所有内容只是为了更改模式(在发布模式下完全重新编译我们的东西需要一段时间)。

答案 5 :(得分:3)

我从一个更大的项目中获得了经验。如果使用对其他解决方案的文件引用的解决方案很少,则必须将引用指向ONE目录,因此显然它必须是连续/夜间构建的“发布”。现在您可以想象如果开发人员想要使用调试版本会发生什么 - 所有引用都指向发布版本。如果它指向同一目录,切换到debug只会在调试模式下重新编译所有相关的东西,文件引用会自动指向调试版本。

另一方面,我没有看到为什么开发人员想要使用发布版本(以及来回切换)的意义 - 发布模式仅对完整/ nighlty版本有用,因此VS中的解决方案默认情况下可以保持在调试模式下,并且构建脚本(无论如何)总是清理,释放构建。

答案 6 :(得分:1)

偶尔会遇到一个特别讨厌的未初始化的内存问题,这个问题只会在发布版本中发生。如果您无法维护(如ChrisF建议的那样)调试和发布二进制文件的单独名称,则很容易忽略您当前使用的二进制文件。

此外,您可能会发现自己正在调整编译器设置(即优化级别,带有调试的发布符号以便于分析等),并且使用单独的文件夹将它们按顺序保存更容易。

这完全取决于个人偏好 - 这就是为什么Visual Studio可以轻松更改选项。

答案 7 :(得分:0)

Visual Studio各种IDE最适合人群使用。他们创建默认的项目结构,二进制文件夹。您可以将二进制文件映射到单个文件夹。然后,您需要教育其他开发人员将Release / Debug文件存储在同一文件夹中。

开发人员会问你,你喜欢谁?

在VC ++中,我们生成了不同的库,您需要链接相应的版本。否则,您将收到链接器错误。

答案 8 :(得分:0)

在装配中保持一致是件好事。你不想处理条件编译/等问题。你的发布和调试dll不兼容的地方,但你试图互相运行它们。

答案 9 :(得分:0)

每个人对技术方面的看法都很重要。另一个方面是,如果一个构建依赖于单输出位置构建,则可能遇到竞争条件,但两个构建之间没有同步。如果在第二次构建开始后可以重新运行第一个构建(特别是在不同的模式下),您将不会真正知道是否正在使用发布构建的调试。

并且不要忘记人性方面:如果两个构建输出到不同的位置,那么知道你正在使用什么(并修复破坏的构建)要容易得多。