エラー番号から「ありがちなミス」を発見しよう
目次
fatal error C1010
原因)
プロジェクトがプリコンパイル済みヘッダファイルを使用する設定の場合、すべてのcppファイルにおいてstdafx.h をインクルードしておく必要があります。
プロジェクトがプリコンパイル済みヘッダファイルを使用する設定の場合、すべてのcppファイルにおいてstdafx.h をインクルードしておく必要があります。
対応)
- おとなしくすべてのcppファイルにおいてstdafx.h をインクルードする。
- プロジェクトがプリコンパイル済みヘッダファイルを使用しない設定に変更してしまう。(非推奨)
error LNK2005 とか LNK1169 とか error LNK2005など
CPPUnit導入失敗時
現象)
- 「"bool __cdecl std::uncaught_exception(void)" (?uncaught_exception@std@@YA_NXZ) は既に libcpmtd.lib(uncaught.obj) で定義されています。 」とか表示される。
対応)
- ランタイムライブラリがマルチスレッド デバッグ DLLになっていない可能性があります。マルチスレッド デバッグではなくマルチスレッド デバッグ DLLであることに注意してください。
error LNK2019
通常時
原因)
定義のない、宣言されただけの関数を呼び出している。
定義のない、宣言されただけの関数を呼び出している。
対応)
定義を書く
定義を書く
テンプレート定義時に発生した時
現象)
テンプレートを
テンプレートを
- ヘッダーAに宣言
- ソースファイルAに定義
- ソースファイルBからヘッダーAを参照し、テンプレートを使おうとする
この時エラーが発生する。
原因)
このエラーは宣言だけ合って定義のない関数を呼び出したりすると出てきたりするんですが、実は似たようなことが起こっている。
このエラーは宣言だけ合って定義のない関数を呼び出したりすると出てきたりするんですが、実は似たようなことが起こっている。
- テンプレートはコンパイル時に型が決定し、そのときに型に合った中身(定義)を作ります。
- ビルドによる実行ファイルの生成は
- コンパイラで各ソースファイルを1つずつコンパイルしてオブジェクトファイル(ソースファイルを機械語に変換したもの)を生成。
- リンカでオブジェクトファイル間の関数呼び出しを対応させ、EXEファイルを生成します。
- コンパイルは各ソースファイル1つ1つが独立して行われる。
以上のことから次のようになっていると考えられる。
(例)ソースファイルBにchar型を指定してテンプレート関数を使用した場合
char型のテンプレート関数の定義は生成されません。
次のような事態になっているはずです。
char型のテンプレート関数の定義は生成されません。
次のような事態になっているはずです。
- ソースファイルBにはテンプレート<char>関数の呼び出し文が書かれているだけ。
- ソースファイルBはヘッダーAを参照しているもテンプレートの宣言が書かれているだけ。
- コンパイラはテンプレート<char>関数がどこか別のソースファイルに定義されていると考える。
- 結果⇒リンク段階でテンプレート<char>関数なんて存在しないことがわかり、リンカエラーになったと判断される。
対応)
- テンプレート定義をソースファイルにではなく、テンプレートを宣言したヘッダーファイルに書き込めばよいものと思われる。