visual-studio - 确定它是在 Visual Studio 中的预链接步骤中调用的 .cmd 脚本中的构建还是重建

标签 visual-studio visual-c++ build build-automation prelink

.cmd 脚本如何从 Visual Studio(分别为 2005、2008、2010、2012 和 2013)项目的预链接阶段确定这是否是完全重建( Build.RebuildSolution/Build.RebuildOnlyProject) 或“普通”构建 (Build.BuildSolution/Build.BuildOnlyProject)?

这是一个外部脚本(LuaJIT,如果您必须知道的话),我不想在每次构建项目时都重建库。相反,我想将完全重建限制在我完全选择该选项的情况下。

最佳答案

How can a .cmd script run from within a Visual Studio (2005, 2008, 2010, 2012 and 2013 respectively) project's pre-link stage determine whether this is a full rebuild ... or "ordinary" build ... ?

我不知道您所要求的确切事情是否可以完成 - 也许其他人知道如何去做。不过,我会建议另一种方法。

我的方法是从预链接步骤中删除 Lua 库的构建到单独的 Visual Studio NMake 项目。如果您创建一个 NMake 项目,您将能够知道正在发生哪种类型的构建(buildrebuild)。

请注意,更高版本的 Visual Studio 仅将项目类型称为“Make”。出于此处讨论的目的,我将项目类型称为“NMake”。我相信这只是命名差异,两个版本之间的基础构建项目保持不变。

作为一个简单的测试,我创建了两个 Visual Studio 应用程序:1) 一个调用批处理文件来创建静态库的 NMake 项目,以及 2) 一个使用步骤 1 中的库的控制台应用程序。

NMake 项目

在 Visual Studio 中,如果您创建一个新的 NMake 项目,您将看到一个允许您提供 MS-DOS 命令的对话框:

Dialog for new make project

如您所见,有以下命令:构建、清理、重建等。我的命令没有上述对话框的屏幕截图,但这是我的 NMake 项目的属性:

NMake lib project properties

我的构建命令只检查输出文件 (lua.lib) 是否存在。如果不存在,则调用 rebuild.bat 批处理文件。我的重建命令总是调用批处理文件。我的 Clean 命令只是删除输出。我不太确定 Output 命令的用途,但我只是填写了构建输出 (lua.lib) 的路径。

现在,如果您进行构建,只有当 lua.lib 文件不存在时才会创建它。如果它已经存在,则什么都不做。如果您进行重建,则会创建一个新的 lua.lib 文件。

控制台应用程序

在我的控制台应用程序中,我添加了对 NMake 项目的引用 - 这样 NMake 项目就先于构建到控制台应用程序。这是控制台应用程序的引用页:

application's reference

我还在应用程序的链接阶段添加了 lua.lib 文件作为输入:

application's link properties

构建控制台应用程序时(在构建过程中),它将根据需要构建 NMake 项目,并在链接器阶段使用输出 (lua.lib)。当控制台应用程序重建时(在重建期间),它也会重建 NMake 项目。

其他想法

我上面的屏幕截图只显示了属性的调试版本。您的项目将必须考虑发布版本。可能有一个 VS 宏来处理这个问题,但我不确定,因为我已经很久没有用 C/C++ 做过任何事情了。

在我上面的测试中,我对构建和重建都使用了一个构建批处理文件。显然,您可以执行相同的操作,也可以使用不同的批处理文件。

关于visual-studio - 确定它是在 Visual Studio 中的预链接步骤中调用的 .cmd 脚本中的构建还是重建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20085613/

相关文章:

c - 从编译器之间的 printf() 获得一致的输出

c - Run-Time Check Failure #2 - s(Microsoft Visual C++ 2015(社区版)上的C语言)

winapi - 了解 : conversion from long_ptr to bool possible loss of data

build - 在 gemfury 中覆盖/强制推送现有的包版本

c++ - ./libmylib.so : undefined reference to `submarinex::LIB::kCount'

visual-studio - 将MSBuild集成到Visual Studio中

c++ - 将map <string,int>保存到文本文件

asp.net - NuGet - 给定类型名称或 DLL,如何找到 NuGet 包?

deployment - 如何从 psake 执行 .bat 文件?

c++ - 在实例方法中使用 find_if