Visual Studio 2010 - エラー・ワーニング - コンパイルエラーなど

クラウディア 
1. 外部シンボル "_IID_IWICImagingFactory" は未解決です
2. コマンド ライン オプション '/clr' と '/MTd' は同時に指定できません
3. D8016: コマンド ライン オプション '/ZI' と '/clr' は同時に指定できません
4. D8016: コマンド ライン オプション '/clr' と '/Gm' は同時に指定できません
5. D8016: コマンド ライン オプション '/clr' と '/RTC1' は同時に指定できません
6. C2872: あいまいなシンボルです
7. C3767: 候補の関数はアクセス可能ではありません
8. C2589: '定数' : スコープ解決演算子 (::) の右側にあるトークンは使えません

1. 外部シンボル "_IID_IWICImagingFactory" は未解決です

 Visual Studio 2010 で MFC をウィザード通りに作成。  直後にビルドすると

1>nafxcwd.lib(afxglobals.obj) : error LNK2001: 外部シンボル "_IID_IWICImagingFactory" は未解決です。
 って、何にも加工してないのにエラーって。  こういうときは、  「プロジェクト」→「プロパティ」→「構成プロパティ」→「リンカー」→「入力」  「追加の依存ファイル」に「windowscodecs.lib」を追加します。

2. コマンド ライン オプション '/clr' と '/MTd' は同時に指定できません

 MFC のプロジェクトで clr を使う必要があったので  「プロジェクト」→「プロパティ」→「構成プロパティ」→「全般」→「共通言語ランタイムサポート」を「共通言語ランタイムサポート(clr)」にしてビルドすると出力されました。 と出るので  「プロジェクト」→「プロパティ」→「構成プロパティ」→「C/C++」→「コード生成」→「ランタイムライブラリ」を  「マルチスレッド デバッグ(/Mtd)」から
「Visual Studio 2010」-「プロパティ ページ」「ランタイムライブラリ」「マルチスレッドデバッグ(/Mtd)」

から「マルチスレッド デバッグ DLL(/MDd)」に変更

「Visual Studio 2010」-「プロパティ ページ」「ランタイムライブラリ」「マルチスレッドデバッグ DLL(/MDd)」

 今度は


1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\atlmfc\include\afx.h(24): fatal error C1189: #error :  Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]
 結局、配布時のことを考えて、MFC をスタティックリンクしようとしたのがいけなかったらしい。  「プロジェクト」→「プロパティ」→「構成プロパティ」→「全般」→「MFC の使用」を  「スタティックライブラリで MFC を使用する」を「共有 DLL で MFC を使う」にしてやっとビルドが通りました。

3. D8016: コマンド ライン オプション '/ZI' と '/clr' は同時に指定できません

 共通言語ランタイムサポート (/clr) を有効にすると、出力されることがあります。  対象のプロジェクトのプロパティで  「構成プロパティ」→「C/C++」→「全般」→「デバッグ情報の形式」が「エディットコンティニュのプログラムデータベース(/ZI)」になっていれば
「Visual Studio 2010」-「プロパティ ページ」「エディット コンティニュのデータベース (/ZI))」

 「プログラムデータベース(/Zi)」に変更します。

「Visual Studio 2010」-「プロパティ ページ」「プログラム データベース (/ZI))」

4. D8016: コマンド ライン オプション '/clr' と '/Gm' は同時に指定できません

 前項同様、共通言語ランタイムサポート (/clr) を有効にすると、出力されることがあります。  対象のプロジェクトのプロパティで  「構成プロパティ」→「C/C++」→「コード生成」→「最小リビルドを有効にする」が「はい (/Gm)」になっていれば
「Visual Studio 2010」-「プロパティ ページ」「最小リビルドを有効にする」「はい (/Gm)」

 「<親またはプロジェクトの規定値から継承>」に変更します。

「Visual Studio 2010」-「プロパティ ページ」「最小リビルドを有効にする」「親またははプロジェクトの規定値から継承」

5. D8016: コマンド ライン オプション '/clr' と '/RTC1' は同時に指定できません

 またか、ってな、もんです。  共通言語ランタイムサポート「/clr」を有効にすると、出力されることがあります。  対象のプロジェクトのプロパティで  「構成プロパティ」→「C/C++」→「コード生成」→「基本ランタイムチェック」が以下のようにになっていれば
「Visual Studio 2010」-「プロパティ ページ」基本ランタイムチェック」「両方」

 「規定」に変更します。

「Visual Studio 2010」-「プロパティ ページ」「基本ランタイムチェック」「既定」

6. C2872: あいまいなシンボルです

 コンパイル時に出力されるエラーです。

1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\atlmfc\include\afxpriv2.h(183): error C2872: 'STATSTG' : あいまいなシンボルです。
1>          'C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\objidl.h(3667) の可能性があります : tagSTATSTG STATSTG''
1>          または 'c:\program files (x86)\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : System::Runtime::InteropServices::STATSTG'
 「共通言語ランタイム サポート (/clr)」を使用していて、ファイルのインクルードと using namespace を使用しているときに起こります。  インクルードファイル内で使用している名前空間を、using namespace で使用すると起こるものだそうで、簡単に解決するには、インクルードファイルやソースファイルで使用している「using namespace」がインクル-ド文の下になるように順番に気を付ければ、解決します。

7. C3767: 候補の関数はアクセス可能ではありません

 C++/CLR のソースコンパイル中に出力されました。

ソース名: error C3767: '空間名::クラス名::メソッド名': 候補の関数はアクセス可能ではありません。
 これは、なかなか手ごわかったですぞ。  たいていのところでは「コールしようとしているメソッドに public がついていませんよ」みたいな説明になっていますが、間違いなく public なメソッドなのにこのエラーとなるのです。

    int sampleClass::sampleMethod(sampleStruct* sample);
 というようなメソッドなのですが。この引数がまずかったようです。  sampleStruct というのはネイティブな C の構造体なのですが、ネイティブな C の構造体をマネージで記述したクラスのメソッドへ引数として渡すと上記のようなエラーになるとのことです。  これを解決するには、クラスとメソッドを記述しているヘッダファイルの中で

#pragma make_public(sampleStruct)
 という風に make_public プラグマなるものを記述します。

8. C2589: '定数' : スコープ解決演算子 (::) の右側にあるトークンは使えません

 これは以下のようなコードを記述したときに発生しました。

    OpenFileDialog ^ pOfd = gcnew OpenFileDialog();

    if (pOfd->ShowDialog() != System::Windows::Forms::DialogResult::OK)
    {
        return nRet;
    }
 いくつか解決方法はあるようですが・・・。  ここでの原因は、このソースのプロジェクト全体で「OK」という定数を使用しているのですが、それと勘違いしているようなのです。  わたしがとった回避策は以下のようにコードを記述しました。

    #undef OK

    OpenFileDialog ^ pOfd = gcnew OpenFileDialog();

    if (pOfd->ShowDialog() != System::Windows::Forms::DialogResult::OK)
    {
        return nRet;
    }

    #define OK 定数値
 正攻法ではないと思いますが、緊急回避策としては使えました。  しかし「System::Windows::Forms::DialogResult::OK」の方はちゃんとスコープ解決演算子をつけているのになんとかならんのかなぁ。
ハイスピードプランJETBOY【usus ウズウズ】