2017-12-08 9 views
1

My Windows Qt widgetsアプリケーションは、バージョン情報ファイルに "version.h"ファイルと "RC"ファイルを使用して、実行ファイルに対してバージョン情報文字列を取り込みます。QtおよびWindows実行ファイルのバージョン情報

version.hをこのようになります...

#ifndef VERSION_H 
#define VERSION_H 

#define VERSION_MAJOR       1 
#define VERSION_MINOR       0 
#define VERSION_BUILD       3 

#define VER_FILEVERSION   VERSION_MAJOR,VERSION_MINOR,VERSION_BUILD,0 
#define STR_FILEVERSION      VERSION_MAJOR##"."##VERSION_MINOR##"."VERSION_BUILD##".0" 

// Keep the product version as fixed 
#define VER_PRODUCTVERSION  1.0.0.0 
#define STR_PRODUCTVERSION   "1.0.0.0\0" 

#define STR_COMPANYNAME      "MyCompany" 
#define STR_FILEDESCRIPTION    "MyFile" 
#define STR_INTERNALNAME     "MyFile" 
#define STR_LEGALCOPYRIGHT    "Copyright © 2017 MyCompany" 
#define STR_LEGALTRADEMARKS1   "All Rights Reserved" 
#define STR_LEGALTRADEMARKS2   STR_LEGALTRADEMARKS1 
#define STR_ORIGINALFILENAME   "MyApp.exe" 
#define STR_PRODUCTNAME      "MyApp" 

#define STR_COMPANYDOMAIN     "mywebsite.com" 

#endif // VERSION_H 

そして、RCファイルは次のように探して:

IDI_APP_ICON ICON DISCARDABLE  "MyApp.ico" 

#include <windows.h> 
#include "version.h" 

VS_VERSION_INFO VERSIONINFO 
FILEVERSION  VER_FILEVERSION 
PRODUCTVERSION VER_PRODUCTVERSION 
BEGIN 
    BLOCK "StringFileInfo" 
    BEGIN 
     BLOCK "040904E4" 
     BEGIN 
      VALUE "CompanyName",  STR_COMPANYNAME 
      VALUE "FileDescription", STR_FILEDESCRIPTION 
      VALUE "FileVersion",  STR_FILEVERSION 
      VALUE "InternalName",  STR_INTERNALNAME 
      VALUE "LegalCopyright",  STR_LEGALCOPYRIGHT 
      VALUE "LegalTrademarks1", STR_LEGALTRADEMARKS1 
      VALUE "LegalTrademarks2", STR_LEGALTRADEMARKS2 
      VALUE "OriginalFilename", STR_ORIGINALFILENAME 
      VALUE "ProductName",  STR_PRODUCTNAME 
      VALUE "ProductVersion",  STR_PRODUCTVERSION 
     END 
    END 

    BLOCK "VarFileInfo" 
    BEGIN 
     VALUE "Translation", 0x409, 1252 
    END 
END 

万全を期すために、 ".PRO" ファイルには、内部にこのラインを持っています:

RC_FILE = MyApp.rc 

これはすべて正常に動作しているようです:exeを右クリックして詳細タブに移動すると、バージョン情報が表示されます結合されたversion.hとRCファイルの他のすべての文字列を返します。

ただし、VERSION_XXX #define値のいずれかを増やしてアプリケーションをビルドすると、報告された「ファイルバージョン」が変更されていないことがわかりました - バージョンを再構築するときのみ変化する。

バージョン情報(主にVERSION_BUILD現時点)を増やすたびに完全な再構築をしたくないので、exeファイルが更新されるたびにこの情報を更新するには何が必要なのでしょうか建てられた?

答えて

1

qmakeは、RC_FILEの依存関係をサポートしていません。では、それについて何ができるのですか?

1)touchを使用するのが最も簡単で簡単な方法です。MyApp.rc(ほとんど)が変更されない場合、タイムスタンプはversion.hのいずれかになります。その後のようなもの:qmake && makeに伴う

MyApp.pro

TARGET = MyApp 
win*:RC_FILE = $${TARGET}.rc 
win*:!build_pass:touch($$RC_FILE, version.h) 
# ... more to follow 

は、トリックを行います。完全なリストについてはqmake Platform Notesを参照してくださいなど、VERSIONQMAKE_TARGET_COMPANYQMAKE_TARGET_DESCRIPTION

2)別の一見簡単な解決策は全くRC_FILEを使用しますが、qmakeが自動的にあらかじめ定義された変数からリソーススクリプトを生成できるようにではありません。

この機能を有効にするにはVERSION = x.y.z.nRC_FILE = MyApp.rc)を.proファイルに追加するだけで十分です。

ほとんどのQtアプリケーションでは、独自のQtリソースシステムを使用していれば十分ですが、Windowsの.rcスクリプトはアプリケーションICONとVERSIONINFOにのみ必要です。

上記の例:

のMyApp

RC_ICONS = MyApp.ico 
VERSION = 1.0.3.0 
QMAKE_TARGET_COMPANY = MyCompany 
QMAKE_TARGET_DESCRIPTION = MyFile 
QMAKE_TARGET_COPYRIGHT = "Copyright © 2017 MyCompany" 
QMAKE_TARGET_PRODUCT = MyApp 
RC_CODEPAGE = 1252 
RC_LANG = 0x0409 

version.pri。プロ

TARGET = MyApp 
#win*:RC_FILE = $${TARGET}.rc 
win*:include(version.pri) 
# ... more to follow 

は残念ながら、これは別の問題を提起する:あなたはまだC++ソースツリー内version.hが必要な場合、あなたはあなたのversion.priで何とかそれを同期化する必要があります。私はを自動生成するためにQMAKE_SUBSTITUTESを使用することが最良の選択だと思います。しかし、DEFINES+=...の束を追加することも考えています。

3).proファイルでカスタムターゲットを作成し、リソーススクリプトを自分でコンパイルすることができます。たとえば、次のように

MyApp.pro

TARGET = MyApp 
#win*:RC_FILE = $${TARGET}.rc 
win* { 
    QMAKE_EXTRA_TARGETS += windows_resource 
    windows_resource.target = $${TARGET}_res$${first(QMAKE_EXT_OBJ)} 
    windows_resource.depends = $${TARGET}.rc version.h 
    msvc:windows_resource.commands = $$QMAKE_RC /fo $$windows_resource.target $${TARGET}.rc 
    else:windows_resource.commands = $$QMAKE_RC $${TARGET}.rc $$windows_resource.target 
    PRE_TARGETDEPS += $$windows_resource.target 
    LIBS += $$windows_resource.target 
} 
# ... more to follow 
関連する問題