在Qt Creator中自动增加内部版本号 我希望在C++源代码中有一个变量(或 Qt Creator定义< >代码>,每次我用它来生成源代码时,它都会增加。有什么方法可以做到这一点,也许是一些Qt-Creator插件或类似的?如果在.pro文件中使用命令行上的“make”来生成?

在Qt Creator中自动增加内部版本号 我希望在C++源代码中有一个变量(或 Qt Creator定义< >代码>,每次我用它来生成源代码时,它都会增加。有什么方法可以做到这一点,也许是一些Qt-Creator插件或类似的?如果在.pro文件中使用命令行上的“make”来生成?,c++,qt,makefile,qt-creator,C++,Qt,Makefile,Qt Creator,有办法,您可以创建一个包含命令行程序结果的变量。然后,您可以使用它来创建定义 BUILDNO = $$(command_to_get_the_build_number) DEFINES += BUILD=$${BUILDNO} 如果您只需要一个简单的递增数字,可以使用一个非常简单的脚本: #!/bin/bash number=`cat build_number` let number += 1 echo "$number" | tee build_number #<-- output a

有办法,您可以创建一个包含命令行程序结果的变量。然后,您可以使用它来创建定义

BUILDNO = $$(command_to_get_the_build_number)
DEFINES += BUILD=$${BUILDNO}
如果您只需要一个简单的递增数字,可以使用一个非常简单的脚本:

#!/bin/bash
number=`cat build_number`
let number += 1
echo "$number" | tee build_number #<-- output and save the number back to file
#/bin/bash
number=`cat build\u number`
设数+=1

echo“$number”| tee build#u number #Caleb的建议很好,但在我的案例中“开箱即用”不起作用。我得到了一些错误,需要一些阅读来修复它们。变化很小。我在Ubuntu Linux上使用Qt4.7。。。如果可以相信的话,第一个变化是在shell脚本中从
let number++=1
变为
let number++
。。。我通常使用/program Windoze,所以我无法解释这一点,但当我在最初的情况下从命令行(shell提示符)运行脚本时,我会报告错误,在更改的情况下,一切正常,并返回递增的数字

由于Caleb没有完全报告它-我使用
build\u number.sh
作为shell脚本的名称,并创建了另一个名为
build\u number
(没有
.sh
)的文件,只在里面放了一个零,没有其他内容

最后一个也是最讨厌的bug是通过将Qt项目文件中的
BUILDNO=$$(命令\u获取\u构建编号)
替换为
BUILDNO=$$系统(./build\u number.sh)
修复的。注意
$$
后面的
系统
,以及文件名前面所需的
/
。后者对于普通的Linux用户来说是基本的,但对于Windows用户来说则不那么重要

希望这能让像我这样的新手更直截了当。如果您寻求qmake,可以在Qt设计器帮助部分阅读更多内容,包括函数参考、高级使用等


哦,最后一句话。。。我还必须将
DEFINES+=-DBUILD=$${BUILDNO}
更改为
DEFINES+=BUILD=$${BUILDNO}
,这样
-D
就消失了。你的C++代码中,你会使用<代码> Bug < /Cube >,就像你写了“代码>”一样,在文件的顶部定义“构建1234”/代码>。

< p>在我做了一些测试之后,我发现原来的解决方案有一个问题,因为每次新的构建完成时版本号都不会被更新。在很多情况下,我编辑了一个源文件,运行了构建,但仍然得到了相同的构建编号。。。构建过程只是决定没有任何更改,并跳过了更新构建编号的步骤。我第一次试图找到一种方法来迫使这一步,但我想不出来。最后我决定走另一条路。现在我使用脚本生成一个头文件
build_number.h
,其中包含一个
#define build
,后面是更新后的编号。所以Calebs脚本现在有点修改了(
build\u number.sh
):

这些行(我把它们放在标题部分之前)强制执行脚本,该脚本从
build\u number
读取最后一个版本号,将其递增,写回,并生成
build\u number.h
文件的更新版本。因为这是项目源的一部分,所以每次新值都会链接到代码中


有一件事值得一提——现在建设过程中从来没有人认为什么都没有改变。因此,即使您保持代码不变,新的make运行也会生成新的版本号并构建新的二进制文件。旧的解决方案在代码更改时留下了数字,这个新的解决方案甚至在源代码未更改的情况下也强制执行新的构建,因为我强制更改了这一个头文件。你可能更喜欢介于两者之间的东西,但由于标题只包含在一个位置,因此重建速度非常快,不会造成太大伤害。但是,如果有人知道如何两全其美,请提出建议。至少现在我不会有两个版本号相同的不同二进制文件。

与Joerg Beutel改进的解决方案相当的Windows:

.pro:

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%
@echo off
copy /b myapp.rc +,,
set /p var= <build.txt 
set /a var= %var%+1 
echo %var% >build.txt
echo #define BUILD %var% >build.h
@echo关闭
set/p var=build.txt
echo#定义构建%var%>BUILD.h
回显%var%
用法

#包括“build.h”
...

qDebug()这是我基于Win7提出的一个解决方案。 此解决方案还使Windows在右键单击您的目标并选择“属性”“详细信息”时提供您的版本。它在Win7中工作,可能是最早的版本

好的,你让你的建筑公司:

@echo off 
set /p var= <build.txt 
set /a var= %var%+1 
echo %var% >build.txt
echo #define BUILD %var% >build.h
echo %var%
@echo off
copy /b myapp.rc +,,
set /p var= <build.txt 
set /a var= %var%+1 
echo %var% >build.txt
echo #define BUILD %var% >build.h
此处提供了更完整的版本:。顺便说一句:如果没有VarFileInfo块,它将无法工作。rc用于右键单击并在Properties | Details中获取此信息。我有一个用于此信息和应用程序图标的M$.rc文件,并在Qt Creator的“资源”下添加其他资源

不是那么随意的:这是我花了一些时间来破解的部分。在Qt Creator中,在yer proj打开的情况下,单击小计算机图标并将其置于释放模式。点击“项目”。单击“添加构建步骤”,选择自定义流程步骤,然后单击帽子图标“^”,直到它位于列表顶部。假设您已将yer.rc命名为“myapp.rc”。使tha构建步骤如下所示:

Command: cmd.exe
Arguments:/c build_inc.bat
Working Directory: %{CurrentProject:Path}
虽然基于qmake的版本可以通过命令行或从IDE调用的命令行工具很好地工作,但我相信在Qt Creator中,构建步骤更可取。Qt Creator并没有为每个构建运行qmake;但是每次构建都会运行构建步骤

现在,将其添加到yer.pro文件:

RC_FILE +=  myapp.rc
另外,将myapp.rc添加到项目中。它将显示在“其他文件”下

现在重建。每次重建都会触发对资源文件的触摸,从而每次都运行“rc”。否则,内部版本号将不会被编码
#include "build.h"

1 VERSIONINFO
FILEFLAGS 32
FILEVERSION 1, 0, BUILD, 0
PRODUCTVERSION 1, 0, BUILD, 0
FILEOS 4
FILETYPE 1

{
    BLOCK "StringFileInfo"
    {
        BLOCK "040904B0"
        {
            VALUE "FileDescription", "program"
            VALUE "OriginalFilename", "program.exe"
            VALUE "CompanyName", "you"
            VALUE "FileVersion", "Release"
            VALUE "LegalCopyright", "Copyright (c) 2016, you, fool!"
            VALUE "ProductName", "Yer proggie"
            VALUE "ProductVersion", "Release"
        }
    }
    BLOCK "VarFileInfo"
    {
        VALUE "Translation", 0x0409, 0x04B0
    }
}
Command: cmd.exe
Arguments:/c build_inc.bat
Working Directory: %{CurrentProject:Path}
RC_FILE +=  myapp.rc
IDI_ICON1 ICON DISCARDABLE "Icons/myicon.ico"
#include <QDebug>
#include "build.h"

#define STR_EXPAND(tok) #tok
#define STR(tok) STR_EXPAND(tok)

qDebug() << QString("(build ")+STR(BUILD)+")";
Command: cmd.exe
Arguments: /c if exist build.old copy /y build.old build.txt
Working Directory: %{CurrentProject:Path}
copy /y build.txt build.old