2

.rcリソース コンパイラが C 定義済みマクロを処理できないため、リソース ファイル ( ) 内に C 定義済みマクロをインポートできないようであることに驚きました。

version.hビルドシステムによって生成/更新されるバージョン情報を に入れようとしていました。このファイルは からインクルードされるはずだったresource.rcので、リソースをビルドすると、ビルドされたすべてのファイルで常に同じバージョンが取得されます。

これはRC_INVOKED、このバグhttp://connect.microsoft.com/VisualStudio/feedback/details/532929/rc4011-warnings-from-vc10-rcと関係があるようです- これは「設計どおり」として閉じられています.

どうすればこの問題を解決できますか?

バージョン情報を更新するために、最終的な exe にパッチを適用する唯一のオプションはありますか? ...これを行うのではなく、より標準的な方法を使用したいと思います。

4

1 に答える 1

2

リソース コンパイラは、インクルードとプリプロセッサの定義を適切に処理します。たとえば、Windows.h をインクルードするとうまく処理できません。しかし、リソース コンパイラによって消費されるファイルでそれが必要になる正当な理由は思いつきません。警告の原因となるものを含まないヘッダー ファイルを使用し、必要なものを定義するだけです。例として、ここで使用する典型的なバージョン管理はこれを行い、うまく機能します。次のような単一のマスター .rc ファイルがあります。

#include <winver.h>

#define stringize( x )        stringizei( x )
#define stringizei( x )       #x

#ifdef VRC_INCLUDE
  #include stringize( VRC_INCLUDE )
#endif

#ifdef _WIN32
  LANGUAGE 0x9,0x1
  #pragma code_page( 1252 )
#endif

1 VERSIONINFO
 FILEVERSION    VRC_FILEVERSION
 PRODUCTVERSION VRC_PRODUCTVERSION
 FILEFLAGSMASK  0x1L
 FILEFLAGS      VS_FF_DEBUG
 FILEOS         VOS__WINDOWS32
 FILETYPE       VRC_FILETYPE
BEGIN
  BLOCK "StringFileInfo"
  BEGIN
    BLOCK "040904E4"
    BEGIN
      VALUE "CompanyName",      stringize( VRC_COMPANYNAME )
      VALUE "FileDescription",  stringize( VRC_FILEDESCRIPTION )
      VALUE "FileVersion",      stringize( VRC_FILEVERSION )
      VALUE "LegalCopyright",   stringize( VRC_COPYRIGHT )
      VALUE "InternalName",     stringize( VRC_ORIGINALFILENAME )
      VALUE "OriginalFilename", stringize( VRC_ORIGINALFILENAME )
      VALUE "ProductName",      stringize( VRC_PRODUCTNAME )
      VALUE "ProductVersion",   stringize( VRC_PRODUCTVERSION )
    END
  END
  BLOCK "VarFileInfo"
  BEGIN
    VALUE "Translation", 0x409, 1200
  END
END

ここから先、可能性はほとんど無限です。すべての定義VRC_INCLUDEを含むインクルード ファイルのフル パスに定義します。VRC_...

rc /d VRC_INCLUDE=$(VersionMainInclude) ... version.rc

またはすべての定義を指定します

rc /d VRC_COMPANYNAME=mycompany ... version.rc

または両方の組み合わせ。

可能性を示すために、git でバージョン管理されたすべてのプロジェクトに対して私が現在行っていることを以下に示します。

  • すべてのプロジェクトには version.h #短い VRC_FILEDESCRIPTION と VRC_FILEVERSION だけを定義するがあります
  • マスター バージョンがあります。h #defining VRC_COMPANYNAME/VRC_COPYRIGHT/...
  • プロジェクトには、ビルド前のイベントで version.res を作成する .targets ファイルが含まれています
  • msbuild prebuild イベントは興味深い処理を行います。他の 2 つを組み合わせて新しい一時ヘッダー ファイルを作成し、短い git SHA と現在のデータを取得して、それをファイル説明文字列に追加するので、次のようになります。

    Foo Dll [12e454re 30/07/2013]

于 2013-07-30T10:33:26.503 に答える