我希望在C++源代碼中有一個變量(或#define
),每次使用Qt Creator構建源代碼時都會增加一個變量。有什麼辦法可以做到這一點,也許有些Qt Creator插件或類似的東西?如果有辦法做到這一點,如果我使用命令行上的「make」來構建?在Qt Creator中自動增加內部版本號
回答
在您的.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
我要指出,這將導致內部版本號遞增每次構建的時候,也如果您嘗試構建但增量失敗,請增加。更好的方法是根據代碼的狀態獲取內部版本號,許多版本控制工具可以爲您提供一個文本字符串,如果不是數字的話。
Caleb的建議非常棒,但在我的情況下,「開箱即用」並不奏效。我得到了一些錯誤,並花了一些閱讀來解決它們。這些變化非常小。我在Ubuntu Linux上使用Qt 4.7 ...如果你能相信它,第一個變化是在shell腳本中從let number += 1
到let 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
一樣。
這是一個關於'-D'的好消息。我會編輯我的答案來修復它。 – 2011-05-08 17:29:35
經過一番測試之後,現在很清楚,這個解決方案並不完美,因爲在很多情況下,qmake步驟在構建過程中沒有執行,因爲「配置沒有改變」。 qmake構建了用於構建應用程序的Makefile,並且它也解釋了我們寫入* .pro文件的內容,但只有一次。在Makefile中,我們發現-DBUILD 29而不是BUILD build_number.sh ...由於在執行qmake時被覆蓋,因此在Makefile中寫入內容是無法解決的。您可以從Designer/Build菜單執行qmake,但它不是自動的。需要解決方案 – 2011-05-08 21:57:48
正如我之前在一些測試後寫到的,我發現原來的解決方案有問題,因爲每次新版本完成時版本號都不會更新。在很多情況下,我編輯了一個源文件,運行構建,但仍然獲得相同的構建編號......構建過程只是決定沒有任何變化,並跳過了更新構建編號的步驟。我首先試圖找到一種方法來強制這一步,但無法弄清楚。最後,我決定採取不同的方式。現在我使用腳本生成一個頭文件 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版本也會生成新的版本號並構建新的二進制文件。舊的解決方案在代碼更改時留下了數字,即使源文件未更改,這個新解決方案也會強制新建,因爲我強制更改該頭文件。一個人會喜歡中間的東西,但由於標題只包含在一個地方,重建速度非常快,並沒有太大的傷害。但是,如果有人知道如何獲得兩全其美的好處,請告知。至少現在我不會有兩個具有相同版本號的不同二進制文件。
當於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;
另請參閱http://qtcreator.blogspot.de/2009/10/generating-automatic-version-numbers.html以獲得稍微更精煉的內容(使用自定義程序生成頭文件)。 – handle 2013-07-03 08:59:48
到目前爲止,我所見過的所有解決方案都因爲我的口味而過分糾結。我已經制作了一個非常簡單的解決方案,可以在QtCreator中正確運行跨平臺。 http://refaqtory.net/blog/?p=34
該鏈接已損壞。 – CodeLurker 2016-11-08 11:43:23
下面是我提出的基於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
編輯:我現在已經使它與一個而不是兩個自定義構建步驟一起工作。
- 1. 自動增加內部版本號
- 2. 如何在PHP中自動增加內部版本號
- 3. 在Java項目中自動增加內部版本號
- 4. 如何在Xcode 5中自動增加內部版本號
- 5. 如何在Visual C++ 2008中自動增加內部版本號?
- 6. MonoTouch的自動增量內部版本號版本號爲
- 7. 使用WIX自動增加內部版本號
- 8. 使用Gradle(不是Android)自動增加內部版本號
- 9. Xcode中多個目標的自動遞增內部版本號
- 10. 爲什麼自動增加版本號?
- 11. 僅在版本上自動增加版本號
- 12. 用於自動提交和增加內部版本號的腳本
- 13. 將自動遞增的內部版本號添加到Meteor應用程序中?
- 14. 哈德森不增加失敗版本的內部版本號
- 15. Qt Creator和條件版本
- 16. Qt Creator的版本混亂
- 17. 如何在TFS團隊版本上自動增加版本/版本號?
- 18. 在ClickOnce部署中自動增加「最低需求版本」?
- 19. ASP.NET:自動遞增版本號
- 20. 在VS 2005中自動跟蹤內部版本號?
- 21. ASP.Net版本號/內部版本號
- 22. 團隊基金會在簽入時自動增加版本號
- 23. 直接在.app中增加版本號?
- 24. 在C#代碼中增加版本號
- 25. 在tfsbuild期間在版本信息中增加版本號
- 26. 我的Visual Studio自動遞增內部版本號語法有什麼問題?
- 27. Git多個版本分支,構建自動增量版本號
- 28. Qt Creator版本有什麼區別?
- 29. 鏈輪版本號自動增加導軌
- 30. Qt Creator中找不到任何有效的Qt版本
我真的想增加每個構建不是每個存儲庫提交。這回答了我的問題。 – Ross 2009-09-13 18:49:26
我用我自己的使用Qt + QMAKE方案: http://indiocolifax86.wordpress.com/2010/05/22/a-scheme-for-automatic-build-numbers-in-cc-projects/ – 2010-07-15 15:33:38
性感.BAT版本:) 關閉@echo 組/ p VAR = ver.txt (只創建與ver.txt 0) –
argh
2010-11-17 16:05:41