为什么"out of source"构建不是默认值?

Bil*_*eal 9 c++

我刚刚发现你可以配置Visual Studio(但这个问题对于任何编译器都是一样的)将中间.o文件转储到源树之外的单独文件夹中,而不是与每个单独的项目一起.这使得清理项目变得容易,以便存档到zip或沿着这些行的东西.

为什么这种配置不常见?有任何重大缺点吗?

jal*_*alf 5

我会选择“因为 VS 是在真空中开发的,外部世界的想法不会经常侵入。以这种方式组织构建文件在 Visual Studio 的第一个版本(或其非 Studio 前身)中可以接受),因为这一直是内部完成的方式,并且没有人从外部进来并说“你知道,世界其他地方真的很想将中间垃圾文件和它们的实际源代码分开”, VS 团队从未认为这是一个问题。

这只是一个猜测,但我想不出更好的解释。


DrP*_*zza 1

这是Visual Studio 中的默认设置,并且已经存在相当长一段时间了(至少可以追溯到 VC++ 6)。中间目录默认与输出目录相同,而不是源目录。这意味着所有目标文件都放置在最终输出旁边。

事实上,如果您正在处理希望将编译器输出与源文件放在一起的项目,则需要一些技巧。由于VC++默认给目标文件与其对应的源文件同名(但扩展名不同),如果你有多个同名的源文件(但路径不同),那么每个源文件的编译都会覆盖对应的对象文件。最后一个要编译的文件“获胜”。

这自然会破坏构建。

要求源文件名在整个项目中全局唯一实际上非常烦人。您可以更改输出位置,例如使其包含路径;链接器仍然做正确的事情。

  • 啊?默认情况下,它会在项目文件夹下创建一个 Debug/Release 子文件夹,其中包含所有中间文件。它当然不会将“所有目标文件与最终输出放在一起”。不是我所说的“来源不明”。 (3认同)
  • 是的,但它也不将它们放在源文件旁边,而是放在子目录中。 (3认同)