質問者
VS2008からVS2012へのプロジェクトの移行(VC++)

質問
-
VC++ のVS2008で作られたソフトウェアをVS2012に移行し、改良したいと考えています。
VS2012からVS2008のソリューションファイルを開き、VC++プロジェクトをアップグレードしましたが、ビルド時にエラーが発生してしまい、修正方法がわかりません。
どなたかアドバイスをいただけますでしょうか?ビルド時のエラー内容は、
1>------ ビルド開始: プロジェクト: XXXXX, 構成: Debug Win32 ------
1> XXXXX.cpp
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afxdlgs.h(108): error C2504: 'CDialog' : 定義されていない基本クラスが宣言されています。
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afxdlgs.h(122): error C2146: 構文エラー : ';' が、識別子 'BOOL' の前に必要です。
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afxdlgs.h(122): error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afxdlgs.h(123): error C2144: 構文エラー : 'void' は ';' によって先行されなければなりません。~~以下も同じようなエラーが100以上出たので割愛します~~
と出ており、先ずは最初の
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afxdlgs.h(108): error C2504: 'CDialog' : 定義されていない基本クラスが宣言されています。
を解決したいと思っています。
この最初のエラー行をダブルクリック(出力ウインドウにおいて)すると、afxdlgs.hの108行目辺り
>class CCommonDialog : public CDialog
>{
がハイライトされます。
CDialogは、afxdlgs.hと同じディレクトリ(C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include)のafxwin.hにあることは確認してまして、プロジェクトの[構成プロパティ]-において"インクルードディレクトリ"に
$(VCInstallDir)include
$(VCInstallDir)atlmfc\include
$(WindowsSDK_IncludePath)
と記載がありましたので、CDialogの定義は認識されると思いますが、ビルド時にエラーが出てしまいます。
ちなみに、プロジェクトの[構成プロパティ]-[全般]-[プラットフォームツールセット]で"Visual Studio 2012 (v110)"を"Visual Studio 2008 (v90)"にするとビルド時にエラーが発生しませんでした。(問題なくアプリが作成できました)
また、アプリケーションの種類はMFCアプリケーションですが、本件とは別のVS2012のMFCアプリケーションのソリューションをビルドしても問題なくビルド出来ています。
開発環境は、VS2012 Premium Update4/Windows 7 Professional SP1 64bit 日本語 です。
当方はVS2012の使用経験が殆どなく、対処法がわからずに困っています。どなたか回答をよろしくお願いいたします。
すべての返信
-
ソリューション内のソースコードを全検索しましたが、afxdlgs.hをインクルードしているところはありませんでした。
しかしながら、stdafx.hでafxext.hをインクルードしており、afxext.hからafxdlgs.hをインクルードしていました。
具体的には、afxext.hの19~21行目のコードで"__AFXDLGS_H__"のdefineが無効であったためにafxdlgs.hをインクルードしていました。
#ifndef __AFXDLGS_H__
#include <afxdlgs.h>
#endif試しにプリプロセッサの定義で"__AFXDLGS_H__"を追加したところ、以下のエラーが出るように変わりました。
1>------ ビルド開始: プロジェクト: XXXXX, 構成: Debug Win32 ------
1> XXXXXXXX.cpp
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afxext.h(75): error C2504: 'CButton' : 定義されていない基本クラスが宣言されています。
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afxext.h(102): error C2146: 構文エラー : ';' が、識別子 'm_bitmap' の前に必要です。
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afxext.h(102): error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afxext.h(103): error C2146: 構文エラー : ';' が、識別子 'm_bitmapSel' の前に必要です。
~~以下も同じようなエラーが100以上出たので割愛します~~
stdafx.h内のdefineとincludeファイル、及びプロジェクトのプリプロセッサの定義の設定に問題があるのでしょうか?
以下に列挙しますのでアドバイスをいただけると幸甚です。
また不足情報があればご指摘をお願いします。
■ stdafx.h内のdefineとincludeファイル
#define VC_EXTRALEAN
#include <afxwin.h>
#include <afxext.h>
#include <afxdisp.h>
#include <afxdtctl.h>
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>
#endif // _AFX_NO_AFXCMN_SUPPORT
#include <afxcontrolbars.h>
------------------------------------------------------■ デバッグ版プロジェクトのプリプロセッサの定義("__AFXDLGS_H__"追加後)
_DEBUG
WIN32
_WINDOWS
_CRT_SECURE_NO_WARNINGS
__AFXDLGS_H__
------------------------------------------------------ -
VS2008のウイザードを実行したところ、おおむね提示されたコードと同じです。
ただし、targetver.hがインクルードされている。afxdtctl.hが条件付きで
インクルードされているなどの細かい違いはありました。
さて、__AFXDLGS_H__をプリプロセッサで定義すると、1.CDialogの未定義エラーは消える。
2.CButtonの未定義エラーが出る。一方
3.CDialog、CButtonともafxwin.h内で定義されているはず。
4.インクルードエラーは出ていない。以上のことから
5.afxwin.h は存在する。
6.ただし、その中にCDialogもCButtonも定義されていない状態になっている。と想像できます。この状態が発生する原因で、考えられるケースは、
◆ VS2012の提供する、afxwin.hが破損している可能性がある。
と考えられます。
また、前提条件として、条件1.stdafx.hはプリコンパイル済みヘッダーである。
条件2.stdafx.cppは、無条件でstdafx.hをインクルードしている
条件3.stdafx.cppは、/Yc(=作成)と指定されている
条件4.他の全てのソース、又はプロジェクト全般に対して、
プリコンパイル済みヘッダーを使用する(/Yu)が指定されている。を再度確認したほうが良いでしょう。
なお、ソリューションエクスプローラの stdafx.cpp (又は/Yc対象ソース)を
右クリックして、表示されるコンテキストメニューから「コンパイル」を選択すると、
単ファイルのコンパイルが実行できるので、繰り返し試す場合はこれを使うほうがよいでしょう。- 編集済み 仲澤@失業者 2014年11月21日 6:31