2009-09-13 43 views
14

我希望在C++源代码中有一个变量(或#define),每次使用Qt Creator构建源代码时都会增加一个变量。有什么办法可以做到这一点,也许有些Qt Creator插件或类似的东西?如果有办法做到这一点,如果我使用命令行上的“make”来构建?在Qt Creator中自动增加内部版本号

回答

16

在您的.pro文件中,您可以创建一个包含命令行程序结果的变量。然后你可以用它来创建一个定义。

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 

我要指出,这将导致内部版本号递增每次构建的时候,也如果您尝试构建但增量失败,请增加。更好的方法是根据代码的状态获取内部版本号,许多版本控制工具可以为您提供一个文本字符串,如果不是数字的话。

+1

我真的想增加每个构建不是每个存储库提交。这回答了我的问题。 – Ross 2009-09-13 18:49:26

+0

我用我自己的使用Qt + QMAKE方案: http://indiocolifax86.wordpress.com/2010/05/22/a-scheme-for-automatic-build-numbers-in-cc-projects/ – 2010-07-15 15:33:38

+2

性感.BAT版本:) 关闭@echo 组/ p VAR = ver.txt (只创建与ver.txt 0) – argh 2010-11-17 16:05:41

4

Caleb的建议非常棒,但在我的情况下,“开箱即用”并不奏效。我得到了一些错误,并花了一些阅读来解决它们。这些变化非常小。我在Ubuntu Linux上使用Qt 4.7 ...如果你能相信它,第一个变化是在shell脚本中从let number += 1let number++ ...我通常使用/ program Windoze,所以我不能解释,但是当我在原始案例中运行脚本(命令提示符)时,我得到错误报告,在更改的情况下一切顺利,返回的数字递增...

由于Caleb没有完全报告 - 我使用build_number.sh作为shell脚本的名称,并创建了名称为build_number(没有.sh)的另一个文件,并且只放入一个零,没有别的。

通过在Qt项目文件中用BUILDNO = $$system(./build_number.sh)代替BUILDNO = $$(command_to_get_the_build_number)来修复最后和最令人讨厌的错误。请注意0​​之后的system以及所需的./前面的文件名。后者对于普通的Linux用户来说是基本的,但对于Windows用户来说不是那么重要。

希望这可以让所有新手都变得更加直接,像我一样。如果你寻求QMAKE,包括函数参考,使用先进等

哦,一个硬道理......我也不得不改变DEFINES += -DBUILD=$${BUILDNO}DEFINES += BUILD=$${BUILDNO},所以-D是您可以在Qt设计帮助部分阅读更多不见了。在您的C++代码中,您可以使用BUILD,就像您在文件顶部写入了#define BUILD 1234一样。

+0

这是一个关于'-D'的好消息。我会编辑我的答案来修复它。 – 2011-05-08 17:29:35

+2

经过一番测试之后,现在很清楚,这个解决方案并不完美,因为在很多情况下,qmake步骤在构建过程中没有执行,因为“配置没有改变”。 qmake构建了用于构建应用程序的Makefile,并且它也解释了我们写入* .pro文件的内容,但只有一次。在Makefile中,我们发现-DBUILD 29而不是BUILD build_number.sh ...由于在执行qmake时被覆盖,因此在Makefile中写入内容是无法解决的。您可以从Designer/Build菜单执行qmake,但它不是自动的。需要解决方案 – 2011-05-08 21:57:48

6

正如我之前在一些测试后写到的,我发现原来的解决方案有问题,因为每次新版本完成时版本号都不会更新。在很多情况下,我编辑了一个源文件,运行构建,但仍然获得相同的构建编号......构建过程只是决定没有任何变化,并跳过了更新构建编号的步骤。我首先试图找到一种方法来强制这一步,但无法弄清楚。最后,我决定采取不同的方式。现在我使用脚本生成一个头文件 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 

的递增数量仍然保存一个名为build_number文件中。我可以通过解析生成的数字头文件来避免第三个文件,但是反对它。请注意,脚本和生成的标题位于项目目录中,而build_number文件位于编译目录中。这并不完美,但我可以忍受它。

为了把事情放在一起,现在有更多的事情要做。首先,生成的头文件需要添加到Qt Designer中的项目中......右键单击头文件和“添加现有文件”。其次,它必须包含在BUILD定义里面被访问的C++文件中...... #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 

这些行(我把他们的头部分之前)强制脚本的执行,从build_number读取最后集结号,将其递增,写回并生成build_number.h文件的更新版本。由于这是项目源的一部分,因此每次都会将新值链接到代码中。

有一件事要提 - 现在的建设过程是从来没有认为没有什么变化。因此,即使您保持代码不变,新的make版本也会生成新的版本号并构建新的二进制文件。旧的解决方案在代码更改时留下了数字,即使源文件未更改,这个新解决方案也会强制新建,因为我强制更改该头文件。一个人会喜欢中间的东西,但由于标题只包含在一个地方,重建速度非常快,并没有太大的伤害。但是,如果有人知道如何获得两全其美的好处,请告知。至少现在我不会有两个具有相同版本号的不同二进制文件。

6

当于Windows约尔格布特尔的改进方案https://stackoverflow.com/a/5967447/1619432

的.pro:

build_nr.commands = build_inc.bat 
build_nr.depends = FORCE 
QMAKE_EXTRA_TARGETS += build_nr 
PRE_TARGETDEPS += build_nr 

HEADERS += build.h 

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% 

使用

#include "build.h" 
... 
qDebug() << "Build number:" << BUILD; 
+0

另请参阅http://qtcreator.blogspot.de/2009/10/generating-automatic-version-numbers.html以获得稍微更精炼的内容(使用自定义程序生成头文件)。 – handle 2013-07-03 08:59:48

-1

到目前为止,我所见过的所有解决方案都因为我的口味而过分纠结。我已经制作了一个非常简单的解决方案,可以在QtCreator中正确运行跨平台。 http://refaqtory.net/blog/?p=34

+0

该链接已损坏。 – CodeLurker 2016-11-08 11:43:23

1

下面是我提出的基于handle's solution的Win7解决方案。 此解决方案还使Windows在您右键单击目标时提供版本#,并选择“属性”|“细节。它适用于Win7,也可能是最早的版本。

好了,你让揭掉build_inc.bat:

@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 

,并把它揭掉PROJ文件夹中。 (copy /b myapp.rc +,,是Microsoft-eese的“触摸” - 更新文件的时间戳。)到目前为止,这么好 - 那又如何?

如果您不需要编码到二进制文件中的版本,则此部分是可选的。创建一个.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 
    } 
} 

更全面的版本可在这里:Versioning DLLs。顺便说一句:没有VarFileInfo块,它将无法工作。这个.rc用于像右键单击和在Properties |中获取这些信息的东西细节。我为这个信息和应用程序图标都有一个M $ .rc文件,并在资源下的Qt Creator中添加其他资源。

不是这样可选的:下面是我花了一些时间寻找的部分。在Qt Creator中,打开yer proj,点击小电脑图标并将其放入发布模式。点击“项目”。点击“添加构建步骤”,选择自定义流程步骤,然后点击帽子图标“^”,直到它位于列表的顶部。假设你已经命名为yer.rc,“myapp.rc”。让塔构建步骤如下:

Command: cmd.exe 
Arguments:/c build_inc.bat 
Working Directory: %{CurrentProject:Path} 

而基于QMAKE版本可能会从一个IDE称为命令行或命令行工具,Qt Creator中很好地工作,构建步骤是最好的,我相信。 Qt Creator实际上并不为每个构建运行qmake;但构建步骤将在每个构建中运行。此外

RC_FILE += myapp.rc 

,加myapp.rc到揭掉凸出:

现在,将它添加到揭掉.pro文件。它会显示在“其他文件”下。

现在重建。每次重建都会触发资源文件,从而每次运行“rc”。否则,内部版本号将不会被编码到二进制权限中。它为我快速运行。每次重建都会增加这个数字。我只是懒得把它们添加到“发布”版本;所以调试版本不会增加这个。他们只会使用最后一个版本的编号。我相信您需要在发布时运行一次以避免出现错误。这不需要每次在Qt Creator中分别重新运行qmake;并且每次都会给你一个不同的内部版本号。它不会触发任何其他重新编译。你有运行“rc”和每次连接的开销,而不是什么都不做,如果一切都是最新的;但OTOH,我只是为了发布版本而做;无论如何,你几乎总是链接到构建或运行;再次,“rc”很快。

可选:您可以在任何你想要的地方移动BUILD预处理符号。 #。 (注意:您还可以用像这样揭掉添加应用程序图标:

IDI_ICON1 ICON DISCARDABLE "Icons/myicon.ico" 

这使得它在浏览器中显示了运行该文件,甚至之前)

您还可以添加“build.h”在Qt Creator中正式使用proj,将它包含在你想使用build#的文件中,并将它用作字符串,例如与:

#include <QDebug> 
#include "build.h" 

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

qDebug() << QString("(build ")+STR(BUILD)+")"; 

我只注意到一个副作用:如果你这样做,它会重建之前,在发布的每一次运行。我想这不是一个可以支付的价格。我想我总是可以将运行时复制到版本目录中,并从资源管理器中运行;或者只是忍受我的about.h的额外编译,“rc”的运行以及发布中每次运行的链接。对于这个问题,我可以创建一个外部工具来使用键盘快捷键运行它。对于这方面的任何改进,我肯定会开放。目前,我并不担心,因为只编译“about.cpp”,运行“rc”并且与每次运行链接都不需要很长时间。不过,人们:自动构建数字!

☮!

编辑:可选:为了让它只在构建或重建项目时递增内部版本号,但不在运行时增加内部版本号(即使版本始终在版本中发布),请转至“项目”|“构建并运行|运行中,单击 “添加部署步骤”,然后选择 “自定义流程步骤”:

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 

后关闭@echo在.bat文件。甚至有可能,虽然涉及到制作定制的新项目模板:Extending Qt Creator Manual

编辑:我现在已经使它与一个而不是两个自定义构建步骤一起工作。

相关问题