天天看點

Qt 使用SVN動态生成exe程式可執行檔案的版本資訊

首先在有SVN版本控制的qt工程pro檔案中加入以下幾行 

SVN_BIN_PATH = C:/Program Files/TortoiseSVN/bin

BEFORE_LINK_CMD_LINE = $$SVN_BIN_PATH/SubWCRev.exe $$PWD/ $$PWD/myapp.rc.template $$PWD/myapp.rc

QMAKE_PRE_LINK += $$quote($$BEFORE_LINK_CMD_LINE)

RC_FILE += $$PWD/myapp.rc
           
SVN_BIN_PATH
        自定義變量,存放SVN bin目錄,根據需要換成自己的SVN安裝目錄

BEFORE_LINK_CMD_LINE
        自定義變量,存放動态更新rc資源檔案的指令,這個指令是關鍵,詳情可以搜尋SVN SubWCRev.exe用法,其中myapp.rc.template 這個檔案很重要,SubWCRev.exe會替換這個檔案中的$WCREV$變量為SVN版本号,生成一個新的檔案myapp.rc,我們的Qt工程就是使用myapp.rc這個資源檔案來生成exe的版本資訊

QMAKE_PRE_LINK
        pro官方變量,表示編譯前執行内容

RC_FILE pro
        官方變量,會根據該檔案資訊,生成exe版本資訊
           

myapp.rc.template檔案見下文 ,如果需要添加應用程式的圖示,在放一個myapp.ico檔案,最後建一個myapp.rc的空檔案,這三個檔案放在pro 同級目錄下,myapp.rc.template檔案第一行就是添加ico圖示資訊,引号裡邊是圖示路徑,可使用相對路徑和絕對路徑,然後構成生成的exe就有版本資訊了,注意第一次建構版本資訊會生成失敗,可能因為第一次myapp.rc這個檔案是空的,建議每次SVN上傳的時候将這兩個檔案上傳

myapp.rc.template

IDI_ICON1 ICON "myapp.ico"

#if defined(UNDER_CE)
#include <winbase.h>
#else
#include <winver.h>
#endif

VS_VERSION_INFO VERSIONINFO
 FILEVERSION 6,0,0,$WCREV$
 PRODUCTVERSION 6,0,0,$WCREV$
 FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
 FILEFLAGS 0x21L
#else
 FILEFLAGS 0x20L
#endif
 FILEOS 0x40004L
 FILETYPE 0x1L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "080004b0"
        BEGIN
            VALUE "CompanyName", "XXX"
            VALUE "FileDescription", "MyApp Application"
            VALUE "FileVersion", "6, 0, 0, $WCREV$"
            VALUE "InternalName", "MyApp "
            VALUE "LegalCopyright", "Copyright (C) 2021"
            VALUE "OriginalFilename", "MyApp .exe"
            VALUE "ProductName", "MyApp Application"
            VALUE "ProductVersion", "6, 0, 0, $WCREV$"
            VALUE "SpecialBuild", "6, 0, 0, $WCREV$"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x800, 1200
    END
END