将 Git 提交哈希读取到C++时出错



我正在尝试将 Git 提交哈希读取到C++应用程序中。使用以下 CMakeList 文件,我得到了正确的提交哈希。

CMakelist

FIND_PACKAGE(Git)
IF(GIT_FOUND)
EXECUTE_PROCESS(
COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
OUTPUT_VARIABLE COMMIT
OUTPUT_STRIP_TRAILING_WHITESPACE)
MESSAGE( STATUS "Commit : ${COMMIT}" )
ELSE(GIT_FOUND)
SET(COMMIT 0)
ENDIF(GIT_FOUND)
set(yada "${COMMIT}")
MESSAGE("lkpoopkpoef".${yada})
add_definitions("-D_GIT_COMMIT_HASH=${yada}")

但是,当我尝试在以下函数中读取C++中的值时,出现错误。

主.cpp

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

在函数 'std::__cxx11::string getGitCommit((' 中: :0:18:错误:"D2cdfd2"未在此范围内声明

d2cdfd2 是提交哈希。

我指的是

  1. http://xit0.org/2013/04/cmake-use-git-branch-and-commit-details-in-project/
  2. 如何在源代码中读取 CMake 变量C++

我试图避免创建另一个文件来存储提交哈希,并希望直接从 CMakeList 中读取此文件。

我正在使用catkin_make在 Ubuntu 16.04 上构建应用程序

我在这里做错了什么?

哈希实际上不是一个字符串。 甚至编译器错误也告诉你这一点。

您需要使用字符串化运算符 (#(。 从 C/C++ 中的字符串化运算符:

#define STRINGIFY_(x) #x
#define STRINGIFY(x) STRINGIFY_(x)
#ifdef _GIT_COMMIT_HASH
return STRINGIFY(_GIT_COMMIT_HASH);
#endif

另请注意,由于此函数始终返回字符串文本,因此const char*返回类型而不是std::string可能更合适。 尽管无论哪种方式都是完全有效的。

另一点是,如果哈希不可用,编译器可能会警告您无法访问第二个return。 如果您不希望发生这种情况,请使用#else指令:

#ifdef _GIT_COMMIT_HASH
return STRINGIFY(_GIT_COMMIT_HASH);
#else
return "unavailable";
#endif

最新更新