VisualStudioのリソースコンパイラについて
VisualC++ 2010で作成したMFCプロジェクトを、VisualC++ 2008でプロジェクトファイルだけ作って共用できるようにすると、ビルドエラーになっちゃいます。
// Microsoft Visual C++ で生成されたリソース スクリプトです。 // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE 2 リソースから生成されました。 // #ifndef APSTUDIO_INVOKED #include "targetver.h" #endif #include "afxres.h" #include "verrsrc.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE BEGIN "resource.h\0" END 2 TEXTINCLUDE BEGIN "#ifndef APSTUDIO_INVOKED\r\n" "#include ""targetver.h""\r\n" "#endif\r\n" "#include ""afxres.h""\r\n" "#include ""verrsrc.h""\r\n" "\0" END 3 TEXTINCLUDE BEGIN "#define _AFX_NO_SPLITTER_RESOURCES\r\n" "#define _AFX_NO_OLE_RESOURCES\r\n" "#define _AFX_NO_TRACKER_RESOURCES\r\n" "#define _AFX_NO_PROPERTY_RESOURCES\r\n" "\r\n" "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)\r\n" "LANGUAGE 17, 1\r\n" "#include ""res\\MFCApplication2.rc2"" // Microsoft Visual C++ 以外で編集されたリソース\r\n" "#include ""l.JPN\\afxres.rc"" // 標準コンポーネント\r\n" "#if !defined(_AFXDLL)\r\n" "#include ""l.JPN\\afxribbon.rc"" // MFC リボンおよびコントロール バー リソース\r\n" "#endif\r\n" "#endif\r\n" "\0" END ///////////////////////////////////////////////////////////////////////////// #endif // APSTUDIO_INVOKED
CPPファイルやヘッダーはビルド通るのですが、リソースファイルの「#include "verrsrc.h"」でビルドエラーになります。VisualC++ 2008にはそんなヘッダーファイルないんですね。
#ifndef APSTUDIO_INVOKED #include "targetver.h" #endif #include "afxres.h" #if 1600 <= _MSC_VER // VS2010以降の場合にインクルードする #include "verrsrc.h" #endif
そんでこんなコードを書いて満足していたんですが、これバグっているんですね。VisualC++ 2010でコンパイルした場合にも「#include "verrsrc.h"」は無効化されたままです。リソースコンパイラ(rc.exe)さんは「_MSC_VER」マクロは定義してくれません。
MFCだから「_MFC_VER」ならいけるんでは?と思いきや、これも「_MFC_VER」が定義されたヘッダーが読み込まれないので使えません。
#ifndef APSTUDIO_INVOKED #include "targetver.h" #endif #include "afxres.h" #ifndef USE_LEGACY_COMPILER // 「verrsrc.h」がない環境ではプロジェクト設定で「USE_LEGACY_COMPILER」を定義する #include "verrsrc.h" #endif
結局、VisualC++ 2008のプロジェクトのリソース設定で「USE_LEGACY_COMPILER=1」って入れて対処しました。
あと大事なことですが、リソースファイル(*.rc)の「TEXTINCLUDE」の部分はリソースを編集した際のエクスポート処理で使われるので、「TEXTINCLUDE」部分のインクルード構文も編集しておく必要があります。