none
VS2008からVS2012へのプロジェクトの移行(VC++) RRS feed

  • 質問

  • 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の使用経験が殆どなく、対処法がわからずに困っています。どなたか回答をよろしくお願いいたします。

    2014年11月19日 9:07

すべての返信

  • (ビルドではなく)リビルドは試されましたか?
    2014年11月19日 9:18
  • リビルドも試しましたが結果は同じでした。

    2014年11月21日 1:07
  • これらのエラー内容は非常に基本的な内容が欠落していることを示しているように思います。
    この様なエラー群が発生するケースとして、最初に疑うべきなのは、

    1.プリコンパイル済みヘッダー(一般にはstdafx.h)が
     「プリコンパイルみヘッダーとして」正しく生成されているか。

    ではないでしょうか。
    つまり、プリコンパイル用のソース(一般的にはstdafx.cpp)が、
    プリコンパイルヘッダーオプション項目について、「作成(/Yc)」に
    設定されているがどうかを確認してみてはどうでしょう。

    2014年11月21日 2:04
  • afxdlgs.hからafxwin.hにCDialogが移動しているということは、プログラムのインクルード宣言をafxdlgs.hからafxwin.h書き換えていないということではないでしょうか?

    確認して書き換えてみてください。


    2014年11月21日 2:04
  • プリコンパイル済みヘッダーの設定は、"プリコンパイル済みヘッダーを使用しない"となっていました。"作成(/Yc)"にしてみましたが同じ結果でした。
    2014年11月21日 4:50
  • ソリューション内のソースコードを全検索しましたが、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__
    ------------------------------------------------------

    2014年11月21日 5:12
  • 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:16
  • 丁寧に回答いただきまして、大変有難く思います。

    条件1~4は確認しましたが、まだ解決はしていません。

    私もVS2008で新規に簡易MFCアプリを作成してVS2012に変換して、設定の差を比較してみたいと思います。

    2014年11月21日 11:32
  • 何が起きているか把握するために、cpp ファイルのプロパティあたりで C/C++ → プリプロセッサ → ファイルの前処理を「はい」に変えてみてください。
    そうすると、インクルード結果が展開されたファイルが出力されるので、クラスが宣言されているかを確認できるでしょう。
    宣言が見つからない場合、インクルードファイルが異なるか、プリプロセッサ定数で無効化されているかです。

    あとはインクルードファイルの表示でどのファイルがインクルードされているか確認することでしょうか。

    2014年11月21日 13:47
    モデレータ