使用头文件变量生成包含目录

时间:2014-07-18 11:32:54

标签: c++ visual-c++ c++11 visual-studio-2013

前一段时间我问过一个问题,询问如何在编译时检查内部库版本,并提出以下解决方案:

// GameVersion.h
constexpr unsigned int LIB_VERSION_MAJOR = 1;
constexpr unsigned int LIB_VERSION_MINOR = 0;
constexpr unsigned int LIB_VERSION_PATCH = 0;

// Function stored in our librarys which static_asserts version with its own data
library_version_check<LIB_VERSION_MAJOR, LIB_VERSION_MINOR, LIB_VERSION_PATCH>();

它不是最好的解决方案,但它允许我们编译时间库版本检查而不是构建应用程序并等待它运行以发现库版本不匹配。

从那时起,我们使用的库已经改变了它们的文件结构:

C:\Library\src            //!< Old structure
C:\Library\1.0.0\src      //!< New structure
C:\Library\1.0.1\src

这会破坏存储在应用程序prop文件中的include目录。最初我们包含一个文件夹(Library \ src),然后进行内部版本检查,现在include目录依赖于存储在此头文件中的版本信息。我想知道在Visual Studio 2013中修改项目是否可能包含基于存储在头文件/源文件中的信息的目录,如本例中的那样?我认为可以这样做,因为某些预构建步骤或外部脚本作为预构建的一部分运行,以生成项目的inculde目录?我很难过如何做到这一点,任何启蒙都会受到高度赞赏。

提前致谢。

1 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是使用用户宏进行构建。不熟悉VS2013因为我需要我的东西仍然在XP上运行而且不能'升级'。我没有使用msbuild,所以不要知道从旧的构建系统中带来了多少东西。

话虽如此,在VS2008中,您可以在.vsprops文件中为3个版本号设置用户宏。这些可用于通过作为参数传递给预构建步骤来生成版本信息文件。 e.g。

make-ver.exe GameVersion.h $(VerMajor) $(VerMinor) $(VerPatch)

然后,您可以在整个构建配置中使用这些用户宏,这些宏将在构建中自动在源代码中更新。

除此方法外,您是否可以不将旧结构用于头部修订?

然后,当您发布版本时,请使用其版本信息将文件复制到版本化文件夹(即将版本信息嵌入到exe / dll的资源中)。

有用于提取版本资源的Windows API。见GetFileVersionInfo。 使用它你可以写一个简单的exe为你做复制。

当我为一些项目构建安装程序时,我会做类似的事情。构建安装程序后,它将从主exe获取版本信息,并将其附加到安装程序的文件名。

我个人不打扰依赖项的版本化源文件夹 - 依赖项都在SVN外部,并与主exe同时构建。这些标记在每个版本中使用一个特殊的脚本标记,该脚本与外部的SVN版本挂钩。