C++ VisualStudio中的复杂构建

C++ VisualStudio中的复杂构建,c++,c,windows,visual-studio,build,C++,C,Windows,Visual Studio,Build,我有一些东西在Visual Studio中找不到好的执行方式: 预构建步骤调用一个代码生成器,该生成器生成一些源文件,这些源文件将在以后进行编译。通过向项目中添加空白文件(稍后将替换为实际生成的文件),可以在一定程度上解决此问题,但如果我不知道自动生成的源文件的名称和/或数量,则无法解决此问题。我可以使用$(生成的通配符/*.c)在gnumake中轻松解决它。如何使用Visual Studio执行类似的操作 如果文件不需要修改(“make”行为),我是否可以阻止预生成/后生成事件运行?当前的解决

我有一些东西在Visual Studio中找不到好的执行方式:

  • 预构建步骤调用一个代码生成器,该生成器生成一些源文件,这些源文件将在以后进行编译。通过向项目中添加空白文件(稍后将替换为实际生成的文件),可以在一定程度上解决此问题,但如果我不知道自动生成的源文件的名称和/或数量,则无法解决此问题。我可以使用
    $(生成的通配符/*.c)
    gnumake
    中轻松解决它。如何使用Visual Studio执行类似的操作

  • 如果文件不需要修改(
    “make”
    行为),我是否可以阻止预生成/后生成事件运行?当前的解决方法是编写一个包装器脚本,它将为我检查时间戳,这是可行的,但有点笨拙

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

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

  • 如果您需要创建行为并习惯了它,您可以创建它们并将其包含在项目中

  • 如果您不想太笨重,可以编写VisualStudio和自定义生成事件,并将它们绑定到特定的生成回调/挂钩

  • 您可以尝试这样的方法,它将允许您以可检入的文件格式为项目设置环境变量。然后用户可以在本地修改它们

  • (1)。我不知道这个问题的简单答案,但有一些解决办法:

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

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

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

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

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


    这种方法的一个缺点是,以这种方式构造的包含路径不包括在VisualStudio的搜索路径中(除非您在VS的“项目和目录”设置中复制了定义)。我曾在PDC08上与一些微软人员讨论过如何为VS2010修复此问题,以及如何总体上改进界面,但他们没有做出可靠的承诺。

    我已经解决了这个确切的问题,并使用自定义构建规则使其正常工作

    但这总是很痛苦,而且效果很差。我放弃了VisualStudio,使用cygwin开发了一个Makefile系统。现在好多了

    cl.exe是VS编译器的名称


    更新:我最近改用了cmake,它也有自己的问题,cmake可以生成一个VisualStudio解决方案。这似乎工作得很好。

    根据您正试图做的事情,有时您可能会幸运地使用自定义构建步骤并正确设置依赖项。将所有生成的代码放入自己的项目中,然后让主项目依赖它,这可能会有所帮助。

    至于第3点。从VS2005开始引入的
    .vsprops
    文件是更好的选择。答案3。这是错误的。自VS2005以来,您可以使用
    .vsprops
    文件在项目范围内执行此操作,而无需外部帮助。从那以后,我一直在广泛地使用它们,并且使用了未更改的项目,在“属性表”(
    .vsprops
    )文件中只调整了一些相关参数。我知道这个答案很旧,但VS2005和2008当时已经发布,因此有一个标准的方法来做。@0xC000002L我不同意这是错误的。当然,你可以使用道具。然而,它不是一个全系统的标准。您必须制定自己的惯例,通过一个层次结构的支撑表来描述所有库,并始终如一地加以实施。从概念上讲,它与(3)中建议的环境变量方法没有什么不同,它的缺点是将您锁定在特定的构建系统中。