Visual Studio C++ 强制重新构建特定文件

6

有没有一种方法可以强制Visual Studio在每次构建时重新构建特定文件?

我有一个版本头文件,其中包含__DATE____TIME__,我希望它在每个版本中自动更新。

我可以使用预构建事件和批处理文件来touch文件,只是想知道是否已经有这个功能了?


如果您更改了其他源文件包含的头文件中的内容,这些文件将自动重建。问题在哪里?我不明白。 - LihO
@LihO 我认为重点在于这个特定的头文件具有某种版本信息,因此必须重新构建,无论是否实际更改了任何文件。(这进一步引出了一个问题,即预处理器在编译时替换__DATE____TIME__字段时,是否会自动标记头文件已更改。我认为不会。) - cf-
1
@LihO,__DATE____TIME__由编译器自动设置为当前日期/时间。但是,只有当编译器认为文件已更改时,它才会处理该文件。 - Martin Beckett
啊,我明白了。其实这是一个好问题,你可以提供一些代码示例,展示你如何使用 __DATE____TIME__,以及你如何在其他源文件中使用(在这个头文件中定义的任何内容)。 - LihO
4个回答

5
您还可以通过预构建步骤删除.obj文件。这将导致编译器重新构建您的.cpp.h文件。右键单击项目 > 属性 > 构建事件 > 预构建事件 > 命令行并添加以下行:
del $(TargetDir)source.obj

1
谢谢您的建议,我现在已经使用了。我认为应该是$(IntDir),也许对您来说与$(TargetDir)是一样的。 - pjcard

4

来自超级用户,尝试添加一个预构建命令:

copy /b filename.ext +,,

这里的filename.ext是你想要修改的头文件的路径和名称。需要注意的是,我不确定VStudio是否总是会执行预编译事件,或只有在它检测到需要进行构建时才会执行。


我从未知道复制有那个标志。我一直在使用Unix工具和预构建的touch。我只是认为这应该是VS支持的一个功能。 - Martin Beckett
我也不知道,只是在谷歌上搜索了一个 Windows 版本的 *nix 的 "touch" 命令。 - Nathan Ernst
此外,我很好奇这是否适用于您的情况(请注意我的警告)。如果适用,请告诉我。 - Nathan Ernst
1
不,如果它认为没有任何文件发生变化,它就不会运行“post”(甚至是“pre”)构建。 - Martin Beckett

0

0

我最近遇到了一个问题,想要在编译时始终更新__DATE____TIME__宏,其根本原因与现有问题相同。没有单一的答案适用于我的情况,但它们对我很有帮助。

如@Martin-Beckett在评论中提到的,即使在pre构建事件中,如果没有检测到任何更改,也不会运行。关键是添加一个post事件来修改感兴趣的文件。每次点击Build时,它都将保证重新编译该文件,因为它已经在上次编译后发生了更改。

对我而言,del $(IntDir)file.objcopy /b file.h +,,方法都可行。我更喜欢复制,因此按照以下步骤进行:

  • 右键单击项目 -> 属性 -> 构建事件 -> 后期构建事件 > 命令行 并添加以下行:

    copy /b file.h +,,

我建议为此添加一个“描述”,因为它会出现在“生成输出”窗口中。现在,我可以连续点击“生成”十次,每次都会重新编译该文件。

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