【问题标题】:Using header file variables to generate include directories使用头文件变量生成包含目录
【发布时间】:2014-07-18 11:32:54
【问题描述】:

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

// 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

这会破坏存储在应用程序属性文件中的包含目录。最初我们会包含一个文件夹(Library\src),然后进行内部版本检查,现在包含目录依赖于存储在此头文件中的版本信息。我想知道是否可以在 Visual Studio 2013 中修改项目包括基于存储在头文件/源文件中的信息的目录,如本示例中的文件?我在想这可以作为某种预构建步骤来完成,或者作为预构建的一部分运行一个外部脚本来为项目生成一个包含目录?不过,我对如何做到这一点感到困惑,任何启发都将不胜感激。

提前致谢。

【问题讨论】:

  • 如何创建一个预处理器宏来为#include 语句提供必要的版本前缀?
  • 现在包含是使用环境变量完成的,例如$(LIB) 并且必须添加一个预处理器宏(这可能是公平的)将涉及必须更改我们编写的每个应用程序中的每一个包含,我认为我的同事不会太热衷于:(
  • 恕我直言,最好的选择是@Pete 在他的回答中所说的。只需使用旧结构保留头部修订,并使用适当的 SVN 外部路径链接旧版本以复制旧结构。

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


【解决方案1】:

一种方法是使用用户宏进行构建。不熟悉 VS2013,因为我需要我的东西仍然可以在 XP 上运行并且无法“升级”。我没有使用过 msbuild,所以不知道从旧的构建系统中继承了多少东西。

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

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

然后,您可以在整个构建配置中随意使用这些用户宏,并且这些宏会在构建过程中自动更新到您的源代码中。

除了这种方法,你能不能只使用旧结构来进行头部修订?

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

有用于提取版本资源的 Windows API。见GetFileVersionInfo。 使用它,您可以编写一个简单的 exe 来为您进行复制。

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

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

【讨论】:

  • 是的,预构建步骤是我正在考虑的那种解决方案,可能有一个特定于应用程序的 prop 文件,它会为您生成带有相关信息的 gameversion.h。不幸的是,仅使用旧文件结构进行 head 修订可能过于复杂,因为在一个系统上同时处理的许多应用程序可能需要不同版本的库,这使得包含变量很难生成。
  • 你用什么做版本控制?
  • 我们使用 sourceanywhere ,就像我想转移到另一个版本控制系统一样,它允许多个用户同时编辑一个文件,它不会很快发生。我最终使用了你的用户生成宏的解决方案,这似乎做得很好,所以我接受你的回答:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多