19 c++ qt makefile qt-creator
我希望#define在C++源代码中有一个变量(或),每次使用Qt Creator构建源代码时都会增加.有什么方法可以做到这一点,也许是一些Qt Creator插件或类似的?如果我在命令行上使用"make"进行构建,有办法吗?
Cal*_*itt 18
在.pro文件中,您可以创建一个包含命令行程序结果的变量.然后,您可以使用它来创建定义.
BUILDNO = $$(command_to_get_the_build_number)
DEFINES += BUILD=$${BUILDNO}
Run Code Online (Sandbox Code Playgroud)
如果您只想要一个简单的递增数字,您可以使用一个非常简单的脚本:
#!/bin/bash
number=`cat build_number`
let number += 1
echo "$number" | tee build_number #<-- output and save the number back to file
Run Code Online (Sandbox Code Playgroud)
我应该注意,这会导致每次构建时构建号都会增加,如果你尝试构建它也会增加但是它会失败.更好的方法是根据代码的状态获取构建号,并且许多版本控制工具可以为您提供文本字符串,如果不是数字.
Windows等效于Joerg Beutel的改进解决方案/sf/answers/417721321/:
的.pro:
build_nr.commands = build_inc.bat
build_nr.depends = FORCE
QMAKE_EXTRA_TARGETS += build_nr
PRE_TARGETDEPS += build_nr
HEADERS += build.h
Run Code Online (Sandbox Code Playgroud)
build_inc.bat:
@echo off
set /p var= <build.txt
set /a var= %var%+1
echo %var% >build.txt
echo #define BUILD %var% >build.h
echo %var%
Run Code Online (Sandbox Code Playgroud)
用法
#include "build.h"
...
qDebug() << "Build number:" << BUILD;
Run Code Online (Sandbox Code Playgroud)
小智 7
正如我之前在一些测试后写的那样,我发现原始解决方案存在问题,因为每次完成新构建时版本号都不会更新.在很多情况下,我编辑了一个源文件,运行构建,但仍然得到相同的构建号...构建过程刚刚决定什么都没有改变,并跳过了更新构建号的步骤.我首先试图找到一种方法来强迫这一步,但无法弄明白.最后我决定采取不同的方式.现在我使用该脚本生成一个头文件
build_number.h,其中包含一个#define BUILD更新后的数字.所以Calebs脚本现在有点修改(build_number.sh):
#!/bin/bash
number=`cat build_number`
let number++
echo "$number" | tee build_number #<-- output and save the number back to file
echo "#define BUILD ""$number" | tee ../MyProject/build_number.h
Run Code Online (Sandbox Code Playgroud)
递增的数字仍存储在一个名为的文件中build_number.我可以通过解析生成的头文件来避免第三个文件,但决定反对它.请注意,当build_number文件位于构建目录中时,脚本和生成的标头位于projects目录中.那不是完美的,但我可以忍受它.
为了把事情放在一起,现在还有一些事情要做.首先,需要将生成的头文件添加到Qt Designer中的项目中...右键单击Header-Files和"Add existing file".其次,它必须包含在C++文件中,其中访问BUILD定义内部#include "build_number.h"......并且最后但并非最不重要的是必须对项目文件(MyProject.pro)进行一些添加.请注意,我从Calebs解决方案中删除了这些内容,因此我们从头开始:
build_nr.commands = ../MyProject/build_number.sh
build_nr.depends = FORCE
QMAKE_EXTRA_TARGETS += build_nr
PRE_TARGETDEPS += build_nr
Run Code Online (Sandbox Code Playgroud)
这些行(我把它们放在HEADERS部分之前)强制执行脚本,该脚本从中读取最后一个构建号build_number,递增它,将其写回并生成build_number.h文件的更新版本.由于这是项目源的一部分,因此每次都会将新值链接到代码中.
有一件事要提 - 现在建筑过程从来没有认为没有任何改变.因此,即使您保持代码不变,新的make运行也会生成新版本号并构建新的二进制文件.旧的解决方案在代码更改时留下了数字,这个新的解决方案强制新的构建,即使源不变,因为我强制更改那个头文件.人们可能会喜欢介于两者之间,但由于标题仅包含在一个地方,因此重建速度非常快且不会造成太大伤害.但是,如果有人知道如何充分利用两个世界,请提供建议.至少现在我没有两个具有相同版本号的不同二进制文件.