在Visual Studio中进行复杂的构build

我有几件事情,我无法find在Visual Studio中执行的好方法:

  1. 预生成步骤调用一个代码生成器,生成稍后编译的一些源文件。 这可以通过在项目中添加空白文件(稍后用实际生成的文件replace)来在一定程度上解决,但是如果我不知道名称和/或自动生成的源文件的数量,则不起作用。 我可以使用$(wildcard generated/*.c)GNU make轻松解决它。 我如何做与Visual Studio类似的东西?

  2. 如果文件不需要修改( "make"行为),我可以阻止预生成/生成后生成事件吗? 目前的解决方法是编写一个包装脚本,它会检查我的时间戳,这是可行的,但有点笨重。

  3. find安装在VS之外的外部库和头文件的好方法是什么? 在* nix的情况下,它们通常会安装在系统path中,或者与autoconf位于同一个位置。 我想我可以在项目设置中指定具有用户自定义macros的path,但是放置这些macros以便可以轻松find和调整的地方在哪里?

只是要清楚,我知道存在更好的Windows构build系统( CMakeSCons ),但他们通常自己生成VS项目文件,我需要将此项目集成到现有的VS构build系统,所以最好是我纯VS项目文件,而不是生成的。

  1. 如果你需要make的行为并且习惯了,你可以创建visual studio的makefile项目并将它们包含在你的项目中。

  2. 如果你不想笨重,你可以编写visual studio 宏和自定义构建事件,并将它们绑定到特定的构建回调/挂钩。

  3. 你可以尝试一下类似workspacewhiz的东西,它可以让你为你的项目设置环境变量,这个文件格式可以被检入。然后用户可以在本地修改它们。

我已经经历了这个确切的问题,我使用自定义构建规则得到它的工作。

但是,这总是一个痛苦,并且效果不佳。 我放弃了visual studio,并使用cygwin与Makefile系统。 现在好多了。

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

更新:我最近切换到使用cmake,它带有自己的问题,和cmake可以生成一个Visual Studio的解决方案。 这似乎运作良好。

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

这种方法的一个缺点是用这种方式构建的包含路径不包括在Visual Studio的搜索路径中(除非您在VS的Projects and Directories设置中重复定义)。 我和PDC08上的一些MS人员谈到了VS2010的固定版本,改进了界面,但没有给他们足够的承诺。

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

1A。 如果生成的文件的内容不冲突(即没有通用的静态标识符等),则可以在项目中添加一个单独的文件,例如AllGeneratedFiles.c,并修改生成器以追加#include“generated / file”。 c“生成生成的/ file.c文件。

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

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

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

具体取决于你正在尝试做什么,有时使用自定义构建步骤并正确设置依赖关系有一些好运。 将所有生成的代码放入其自己的项目中,然后让主项目依赖于它可能会有所帮助。