在Visual Studio中进行复杂构建

7

我有一些在Visual Studio中无法很好执行的事情:

  1. 预构建步骤调用代码生成器生成一些源文件,稍后编译这些文件。可以通过向项目添加空文件(稍后用真正生成的文件替换)来解决这个问题,但如果我不知道自动生成的源文件的名称和/或数量,则无法解决。在GNU make中,我可以使用$(wildcard generated/*.c)轻松解决它。如何在Visual Studio中实现类似的功能?

  2. 如果文件不需要修改,我能否防止预构建/后构建事件运行(类似于“make”行为)?当前的解决方法是编写一个包装脚本来检查时间戳,这有效,但有点笨重。

  3. 定位在VS之外安装的外部库和头文件的好方法是什么?在*nix情况下,它们通常安装在系统路径中,或者使用autoconf定位。我想我可以在项目设置中使用用户定义的宏指定路径,但是放置这些宏的好地方在哪里,以便可以轻松找到并进行调整?

只是为了明确,我知道存在更好的Windows构建系统(例如CMakeSCons),但它们通常自己生成VS项目文件,并且我需要将此项目集成到现有的VS构建系统中,因此最好只使用普通的VS项目文件,而不是生成的文件。

5个回答

5
  1. 如果您需要进行行为并已经习惯了它,您可以创建Visual Studio Makefile Projects并将其包含在您的项目中。

  2. 如果您希望更少地使用这个东西,您可以编写 Visual Studio 和自定义构建事件,并将它们绑定到特定的生成回调/钩子上。

  3. 您可以尝试一些类似于 Workspace Whiz 的工具,它将允许您为您的项目设置环境变量,以文件格式进行检查。然后用户可以在本地修改它们。


1
至于第三点,从VS2005开始引入的.vsprops文件是更好的选择。 - 0xC0000022L

4

我曾经遇到过这个问题,使用自定义构建规则解决了它。

但是这种方法总是很麻烦,效果也不好。我放弃了Visual Studio,改用Cygwin的Makefile系统。现在好多了。

cl.exe是VS编译器的名称。

更新:我最近转而使用cmake,虽然它也有自己的问题,但cmake可以生成Visual Studio解决方案。这似乎很有效。


2

针对第三点,我使用属性页来指定第三方库的位置设置(包括路径、链接路径等)。您可以从父级或更高级别的属性表中使用用户宏来指定库本身的起始点(如果它们在共同的根位置),然后使用基本路径宏为每个库定义单独的表。这不是自动的,但很容易维护,每个开发人员都可以有不同的根目录(在我们的环境中是这样的)。

这种方法的一个缺点是,以这种方式构建的包含路径不会被包含在Visual Studio的搜索路径中(除非您在VS的项目和目录设置中重复定义)。我在PDC08上与一些微软人员交谈过,希望在VS2010中解决这个问题,并改进界面,但他们没有做出实质性的承诺。


1

(1) 我不知道一个简单的答案,但有些变通方法:

1a. 如果生成文件的内容不冲突(即没有共同的静态标识符等),则可以向项目中添加一个单独的文件,如AllGeneratedFiles.c,并修改生成器在生成generated/file.c时将#include"generated/file.c"追加到此文件中。

1b. 或者您可以创建一个基于makefile的项目来针对生成的文件进行构建,并使用nmake进行构建。

(2)。使用自定义构建规则而不是后置构建事件。您可以通过在解决方案资源管理器中右键单击项目名称并选择“自定义构建规则”来添加自定义构建规则。

(3)。没有标准的方法来做到这一点; 它必须根据每个项目进行定义。一种方法是使用环境变量来定位外部依赖项。然后可以在项目属性中使用这些环境变量。添加一个readme.txt文件,描述所需的工具和库以及用户必须设置的相应环境变量,任何人都可以轻松设置。


第三个答案是错误的。自从VS2005以来,我们可以使用.vsprops文件在项目范围内完成这个精确的事情,而不需要外部帮助。我一直在广泛使用它们,并且已经使用未更改的项目,只需在“属性表”(.vsprops)文件中调整几个相关参数。我知道这个答案很老了,但是当时VS2005和2008已经发布,因此一种标准方法可以做到这一点。 - 0xC0000022L
@0xC0000022L 我不同意它是错误的。当然,你可以使用属性表(propsheets)。但是,它不是一个全局标准。你需要开发自己的约定来通过一系列的属性表描述所有库,并始终执行。从概念上讲,它与第(3)条建议的环境变量方法没有区别,并且有一个缺点是将你锁定在特定的构建系统中。 - atzz

1

根据您所要做的具体任务,有时候使用自定义构建步骤并正确设置依赖关系可能会有所帮助。将所有生成的代码放入一个单独的项目中,然后让您的主项目依赖于它可能会更加有益。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接