2009-09-13 128 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

編輯:我現在已經使它與一個而不是兩個自定義構建步驟一起工作。

相關問題