7

我有一些事情在 Visual Studio 中找不到执行的好方法:

  1. 预构建步骤调用一个代码生成器,该生成器生成一些稍后编译的源文件。这可以通过在项目中添加空白文件(稍后将其替换为真实生成的文件)在有限程度上解决,但如果我不知道名称和/或自动生成的源文件的数量,它就不起作用。我可以很容易地在GNU make使用中解决它$(wildcard generated/*.c)。如何使用 Visual Studio 做类似的事情?

  2. 如果不需要修改文件("make"行为),我可以阻止预构建/构建后事件运行吗?当前的解决方法是编写一个为我检查时间戳的包装器脚本,它可以工作,但有点笨拙。

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

为了清楚起见,我知道存在更好的 Windows 构建系统(CMake, SCons),但它们通常会自己生成 VS 项目文件,我需要将此项目集成到现有的 VS 构建系统中,所以我希望我只有普通的 VS项目文件,而不是生成的文件。

4

5 回答 5

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

  2. 如果您想要不那么笨重,您可以编写 Visual Studio和自定义构建事件,并将它们绑定到特定的构建回调/挂钩。

  3. 您可以尝试类似workspacewhiz的方法,它可以让您以可以签入的文件格式为您的项目设置环境变量。然后用户可以在本地更改它们。

于 2008-11-21T05:56:53.280 回答
4

我已经解决了这个确切的问题,并且确实使用自定义构建规则让它工作。

但这总是很痛苦,而且效果不佳。我放弃了 Visual Studio,转而使用 cygwin 的 Makefile 系统。现在好多了。

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

更新:我最近改用cmake,它本身就有问题,而cmake可以生成Visual Studio的解决方案。这似乎运作良好。

于 2008-12-20T01:09:00.027 回答
2

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

这种方法的一个缺点是,以这种方式构建的包含路径不包含在 Visual Studio 的搜索路径中(除非您在 VS 的项目和目录设置中复制定义)。我在 PDC08 上与一些 MS 人员谈过为 VS2010 修复此问题,并总体改进界面,但他们没有做出可靠的承诺。

于 2008-11-21T07:04:45.780 回答
1

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

1a。如果生成文件的内容没有冲突(即没有通用的静态标识符等),您可以向项目添加单个文件,例如 AllGeneratedFiles.c,并修改您的生成器以附加 #include "generated/file. c" 到这个文件,当它产生生成/file.c 时。

1b。或者,您可以为生成的文件创建一个单独的基于 makefile 的项目并使用 nmake 构建它们。

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

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

于 2008-11-21T06:30:06.710 回答
1

根据您正在尝试执行的操作,您有时可以通过使用自定义构建步骤并正确设置依赖项来获得一些运气。将所有生成的代码放入自己的项目中,然后让您的主项目依赖它可能会有所帮助。

于 2009-06-04T21:28:27.997 回答