11

有没有人有使用 Visual Studio C++ 构建的生成文件(在 VS 2005 下)而不是使用项目/解决方案设置的经验。对我们来说,项目/解决方案的工作方式并不直观,当您尝试使用特定编译时间标志调整构建时会导致配置爆炸。

在 Unix 下,很容易设置一个 makefile,它的默认选项被用户设置(或其他配置设置)覆盖。但是在 Visual Studio 中做这些类型的事情似乎很困难。

例如,我们有一个需要为 3 个不同平台构建的项目。每个平台可能有多个配置(例如调试、发布和其他几个)。对于一个新成立的项目,我的目标之一是拥有一个可以让所有平台构建在一起的解决方案,这使得构建和测试代码更改更容易,因为您不必打开 3 个不同的解决方案来测试您的代码。但是 Visual Studio 将需要 3 *(基本配置数量)配置。即PC调试、X360调试、PS3调试等。

似乎makefile解决方案在这里要好得多。包含一些基本的批处理文件或脚本,很容易将配置扩展保持在最低限度,并且只为我们必须执行的所有不同构建维护一小部分文件。

但是,我没有使用 Visual Studio 下的 makefile 的经验,并且想知道其他人是否有可以分享的经验或问题。

谢谢。

(编辑后提到这些是 C++ 版本)

4

5 回答 5

5

我发现大型项目的 makefile 有一些好处,主要与统一项目设置的位置有关。如果源文件列表、包含路径、预处理器定义等都在 makefile 或其他构建配置文件中,则管理它们会稍微容易一些。对于多种配置,添加包含路径意味着您需要确保通过 Visual Studio 的繁琐项目属性手动更新每个配置,随着项目规模的扩大,这可能会变得非常乏味。

使用大量自定义构建工具的项目也更易于管理,例如,如果您需要编译像素/顶点着色器,或者在没有原生 VS 支持的情况下使用其他语言编写代码。

但是,您仍然需要有各种不同的项目配置,因为您需要为每个配置区分构建工具的调用(例如,传递不同的命令行选项来制作)。

立即想到的缺点:

  • 较慢的构建:VS 在调用外部工具方面并不是特别快,甚至在确定是否需要首先构建项目时也不是特别快。
  • 尴尬的项目间依赖关系:设置起来很繁琐,依赖者会导致基础项目构建,并且更容易确保它们以正确的顺序构建。我在让 SCons 做这件事方面取得了一些成功,但要做好工作总是一个挑战。
  • 丢失了一些有用的 IDE 功能:编辑并继续是主要功能!

简而言之,您将花费更少的时间来管理您的项目配置,而是花更多的时间来引导 Visual Studio 正常工作。

于 2008-09-09T13:45:36.523 回答
2

Visual Studio 是在MSBuild配置文件之上构建的。您可以将 *proj 和 *sln 文件视为 makefile。它们允许您完全自定义构建过程。

于 2008-09-09T13:26:32.420 回答
1

虽然在技术上是可行的,但它在 Visual Studio 中并不是一个非常友好的解决方案。它会一直和你战斗。

我建议你看看NAnt。这是一个非常强大的构建系统,您基本上可以在其中做任何您需要做的事情。

我们的 NAnt 脚本在每次构建时都会这样做:

  1. 将数据库迁移到最新版本
  2. 从数据库生成 C# 实体
  3. 在我们的“主”解决方案中编译每个项目
  4. 运行所有单元测试
  5. 运行所有集成测试

此外,我们的构建服务器利用这一点并增加了 1 个任务,即生成 Sandcastle 文档。

如果您不喜欢 XML,您还可以查看Rake (ruby)、Bake/BooBuildSystem (Boo) 或Psake (PowerShell)

于 2008-09-09T13:28:36.500 回答
0

您可以使用 nant 单独构建项目,从而替换解决方案并拥有 1 个编码解决方案而没有构建解决方案。

要记住的一件事是,vs 2005 及更高版本的解决方案和 csproj 文件是 msbuild 脚本。因此,如果您熟悉 msbuild,您可能能够使用现有文件,使 vs 更容易,并使您的部署更容易。

于 2008-09-09T13:26:41.357 回答
0

我们的设置与您描述的类似。我们支持至少 3 个不同的平台,因此我们发现使用CMake来管理不同的 Visual Studio 解决方案。设置可能有点痛苦,但它几乎可以归结为阅读文档和一些教程。通过转到项目和解决方案的属性,您应该能够做几乎所有可以做的事情。不确定您是否可以将所有三个平台构建一起存在于同一个解决方案中,但您可以使用CruiseControl来处理您的构建,并根据需要经常运行您的测试脚本。

于 2008-09-09T14:58:49.217 回答