如何将git提交编号包含在c++可执行文件中
how to include git commit-number into a c++ executable?
我使用git作为我的c++项目的版本跟踪器。
有时我需要重复计算,我想知道我使用了哪个版本的程序。
将提交的#放入主可执行文件的好方法是什么?换句话说。我希望程序在运行程序时,在介绍性消息中告诉我当前提交的#。
我能想到的一种方法是从shell中制作c++程序午餐"git log",并提取commit#,但我不确定在制作过程中如何做到这一点。
(我使用linux)
可能最简单的方法是在makefile中添加一个规则,以生成一个具有当前git commit ID:的.c文件
gitversion.c: .git/HEAD .git/index
echo "const char *gitversion = "$(shell git rev-parse HEAD)";" > $@
现在,只需像往常一样将gitversion.c
添加到构建过程中即可。请确保在make clean
上删除它,并将它添加到.gitignore
中,这样它就不会意外添加到git存储库中。将extern const char *gitversion;
添加到某个标头中,您就可以这样访问它。
我在CMakeLists.txt中执行以下操作:
IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/.git)
FIND_PACKAGE(Git)
IF(GIT_FOUND)
EXECUTE_PROCESS(
COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
OUTPUT_VARIABLE "kml2maps_BUILD_VERSION"
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
MESSAGE( STATUS "Git version: ${kml2maps_BUILD_VERSION}" )
ELSE(GIT_FOUND)
SET(kml2maps_BUILD_VERSION 0)
ENDIF(GIT_FOUND)
ENDIF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/.git)
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/kml2mapsVersion.h.in ${CMAKE_CURRENT_BINARY_DIR}/kml2mapsVersion.h @ONLY)
因此,git rev-parse --short HEAD
的输出可以很好地构建在二进制文件中。
我使用git describe
来获得一个使用标记或提交号的版本。如果分支的顶端在"v0.1"标记之上有额外的提交,那么这通常会给出不错的版本,比如:v0.1-1-g787c667
。
我使用的git命令是:git describe --tags --always
。我通常将其与SCons构建系统一起使用,并将其定义为SConstruct:的常量、相关部分
import os, sys
from subprocess import *
def getGitDesc():
return Popen('git describe --tags --always', stdout=PIPE, shell=True).stdout.read ().strip ()
GIT_DESC = getGitDesc ()
print "Building " + getGitDesc () + ".."
env = Environment ()
# set up environment
env.Append (CPPDEFINES = { 'GIT_DESC' : ('\"%s\"' % GIT_DESC) } )
# build your program
env.Program (....)
在C或C++程序中,我现在可以访问GIT_DESC
作为字符串常量:
# include <iostream>
using namespace std;
int main (int argc, char ** argv) {
cout << "Version: " << GIT_DESC << endl;
return 42;
}
注意:git describe
的--abbrev=N
参数可能有助于实现独立于用户git配置的一致版本输出。
如果您正在使用Qt,请将其放在项目的.pro文件中:
win32:DEFINES += GIT_BIN='C:\Git\bin\git'
# or 'C:\Progra~1\Git\bin\git' - ymmv with putting spaces in here
win32:DEFINES += GIT_REVISION='\"$$system($${GIT_BIN} rev-parse --short HEAD)\"'
unix:DEFINES += GIT_REVISION='\"$$system(git rev-parse --short HEAD)\"'
然后在代码中使用GIT_REVISION
,就像在其他答案中一样——它的行为就像const char *
。
(感谢Alexander Barthel,我从他那里获得了这条消息。)
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- CMake:如何将库 A 链接到库 B,然后将可执行文件链接到库 A
- 如何使字符串出现在编译的二进制可执行文件的开头?
- 程序在使用 system() 启动另一个可执行文件时停止
- 如何更改使用 CPack 安装的可执行文件的名称?
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- CMake:我们可以为一组不形成可执行文件或库的特定文件指定包含目录吗?
- 如何将图像传入C++可执行文件并将输出图像存储在新目录中?
- 共享库 (.so) 没有扩展名的 Linux 可执行文件之间的区别?
- 如何在 linux 可执行文件中使用静态库
- 错误:当我从"WinDbg"打开可执行文件时,找不到符号文件。默认导出 ntdll 的符号.dll
- 编译的C可执行文件被Windows defender检测为病毒
- Linux 可执行文件通过 dlopen 在emplace_back崩溃打开共享库
- 是否可以在命令行中将输入参数传递给可执行文件
- 如何在可执行文件中存储常量数组?
- 如果包含映射的静态库与可执行文件和动态库链接,静态映射(变量)是否会被多次释放?
- 可执行文件C++包括.obj,.lib和.dll吗?
- 无法在 Linux 上运行C++ ZMQ 项目的可执行文件
- 从 C 可执行文件加载动态库时收到错误C++"undefined symbol"