【问题标题】:Visual Studio 2015 - define preprocessor variable with git branch and git commitVisual Studio 2015 - 使用 git branch 和 git commit 定义预处理器变量
【发布时间】:2017-09-27 11:12:27
【问题描述】:

我在 Visual Studio 2015 上使用 C++ 并使用 Git 作为源代码控制。 我正在编写一个多平台应用程序,并希望我的应用程序包含 git 分支并提交它。

在 Visual Studio 以外的平台上,我在 Makefile 中添加了以下几行:

GIT_CUR_COMMIT := $(shell git rev-parse --verify HEAD)
GIT_CUR_BRANCH := $(shell git rev-parse --abbrev-ref HEAD)
DEPS += -DGIT_COMMIT=\"$(GIT_CUR_COMMIT)\" -DGIT_BRANCH=\"$(GIT_CUR_BRANCH)\"

然后在我的应用程序中,我有代码来读取这些预处理器变量并以编程方式公开它们:

std::string getGitCommit()
{
    #ifdef GIT_COMMIT
    return GIT_COMMIT;
    #endif
    return "unavailable";
}

std::string getGitBranch()
{
    #ifdef GIT_BRANCH
    return GIT_BRANCH;
    #endif
    return "unavailable";   
}

但在 Visual Studio 中没有 Makefile。如何在编译时定义这两个变量 GIT_CUR_COMMITGIT_CUR_BRANCH 并实现相同的行为?

【问题讨论】:

  • 我在 Visual Studio 中使用 makefile 构建。所以“没有生成文件”并不是一个真理,而是你如何选择使用 Visual Studio 进行构建。我假设您正在使用基于 vcproj 的构建?
  • 是的,很抱歉没有说清楚。我正在使用基于 vcproj 的建筑

标签: c++ visual-studio cross-platform


【解决方案1】:

可能 - 您可以在 VS 中以完全相同的方式执行此操作 - 但我觉得以下过程会更容易实现

在项目属性中选择“Build Events”/“Pre-Build Event”

在命令行中添加以下命令

echo | set /p dummyName=#define GIT_CUR_COMMIT >  gitparams.h
git rev-parse --verify HEAD >>  gitparams.h

echo | set /p dummyName=#define GIT_BRANCH >>  gitparams.h
git rev-parse --abbrev-ref HEAD >>  gitparams.h

这应该在你每次编译你的项目时生成以下头文件(gitparams.h)

#define GIT_CUR_COMMIT 8a6b3f147fababda57ddd39262df5aa83bc853c4
#define GIT_BRANCH master

确保将其添加到 .gitignore

在你的代码中你可以使用

#include "gitparams.h"

#define ADD_QUOTES_HELPER(s) #s
#define ADD_QUOTES(s) ADD_QUOTES_HELPER(s)

std::string getGitCommit()
{
#ifdef GIT_CURR_COMMIT
    return ADD_QUOTES(GIT_CURR_COMMIT);
#endif
    return "unavailable";
}

【讨论】:

  • 由于我正在编写一个跨平台应用程序,我希望我的代码在不同平台上尽可能相似。您提到有一种方法可以完全按照我在 VS 中所做的操作。你能详细说明它是什么吗?
  • 您可能可以在预构建步骤中设置一些环境变量并在编译步骤中使用它。但是为什么不创建一个跨平台的 makefile 来为你生成 gitparams.h - 这样你的代码在所有平台上都是一样的呢?
  • 我可以这样做,但我的代码已经可以使用环境变量,如果可能的话,我不想改变它。你能用环境变量写下完整的解决方案吗?
  • 我真的看不出由#define 或 -D 编译标志设置的宏与您的代码有关。但是,如果您仍想调查环境变量方法,请参阅此stackoverflow.com/questions/419979/…
  • 我认为编写“gitparams.h”之类的新文件的方法不如在 Makefile 中定义预处理器变量那么干净。无论如何,我按照您发送的链接进行了操作,得出的结论是,如果不安装插件或进行非常复杂的调整,这是不可能的。我发现它没有一个简单的解决方案很令人惊讶
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-31
  • 1970-01-01
  • 2023-03-10
  • 2011-10-01
  • 1970-01-01
  • 2016-03-02
  • 2016-03-23
相关资源
最近更新 更多