我想了解外部联系和内部联系及其区别.
我也想知道的意思
const默认情况下,变量内部链接,除非另有声明extern.
我的CMakeLists.txt文件中有以下命令
configure_file([...]/Version.h.in [...]/Version.h @ONLY)
Run Code Online (Sandbox Code Playgroud)
如何在每次构建时运行它,但不仅仅是在Version.h.in更改时?我需要它,因为它中Version.h有__DATE__宏,实际上应该被视为每个构建的新内容,即使它保持不变.
的Version.h.in模样
static const char VERSION[] = "Bla-bla-bla " @FOOBAR@ " built on " __DATE__;
Run Code Online (Sandbox Code Playgroud) 我希望在命令输出发生变化时触发CMake配置; 具体来说,我正在尝试在输出git describe --always --dirty从上一次CMake配置发生变化时尝试进行CMake 配置.
大多数问题都可以通过观察HEAD文件并解析内部的symref refs/heads/[branch]并将它们链接起来来解决,configure_file(...)但是当树处于脏状态时(IE存在未提交的修改时,IE不会).在这种情况下,git describe --always --dirty会将-dirty后缀附加到输出.
当发生这种情况时,git文件没有变化,只有git注意到存储状态的差异所以我不能configure_file(...)在这里找到任何文件让cmake注意到更改并重新配置.
所以我想找到是否有办法让cmake运行git命令注意输出的差异并触发重新配置,几乎需要类似于预重新配置检查阶段的东西.
不确定这是否可能,如果有人有任何想法如何可以实现这种行为?
一个相当常见的要求,是:我想myapp --version显示版本和Git提交哈希(包括存储库是否脏).该应用程序是通过一个Makefile(实际生成的qmake,但现在让它保持"简单")构建的.我非常精通Makefiles,但这个让我很难过.
我可以像这样轻松获得所需的输出:
$ git describe --always --dirty --match 'NOT A TAG'
e0e8556-dirty
Run Code Online (Sandbox Code Playgroud)
C++代码期望提交哈希值可用作预处理器宏GIT_COMMIT,例如:
#define GIT_COMMIT "e0e8556-dirty" // in an include file
-DGIT_COMMIT=e0e8556-dirty // on the g++ command line
Run Code Online (Sandbox Code Playgroud)
下面是我尝试将git describe输出检测到C++ 的几种不同方法.他们都没有完美的工作.
$(shell)功能.我们使用make的$(shell)函数来运行shell命令并将结果粘贴到make变量中:
GIT_COMMIT := $(shell git describe --always --dirty --match 'NOT A TAG')
main.o: main.cpp
g++ -c -DGIT_COMMIT=$(GIT_COMMIT) -o$@ $<
Run Code Online (Sandbox Code Playgroud)
这适用于干净的构建,但有一个问题:如果我更改Git哈希(例如通过提交或修改干净的工作副本中的某些文件),make不会看到这些更改,并且二进制文件不会重建.
version.h在这里,我们使用make recipe来生成version.h包含必要的预处理器定义的文件.目标是虚假的,因此它总是被重建(否则,它将始终被视为在第一次构建之后的最新版本).
.PHONY: version.h
version.h:
echo "#define …Run Code Online (Sandbox Code Playgroud)