意味不明なリンカエラー (1)

VC++(.NET)で、コンパイルは通るのに、リンクでエラーになる。

hoge.obj : error LNK2001: 外部シンボル "(シンボル名)" (C++でのシンボル名?)" は未解決です。

C++ でのシンボル名というのは "??メソッド名や名前空間を@@でつないだような文字列" みたいなやつ。

Microsoft の説明を見ると、これは、

シンボル名は宣言されているが、実装がない(見つからない)

ケースが多いだろうと。つまり、

  • シンボル名(関数名など)は宣言されているが、実装が宣言と違う(引数リストとか型とか)。
  • シンボル名は宣言されているが、実装がない。

というパターンになるだろうなぁと。

前者の間違いは比較的発見しやすいが、後者の場合にハマることが多い。 つまり、宣言通りに実装している(はずである)のに、リンカが「実装がない」と怒っていると。 ちゃんと探せよボケリンカ!といいたくなるエラー。

宣言はヘッダー(.h)に書いて、実装を別のファイル(.cpp など)に書く場合、 かつ、それらのソースが同じプロジェクトに含まれていない場合に、 そのヘッダのみを include して使おうとしたときに、 リンカがこの実装を見つけてくれないというパターンが多い。

この場合、次の解決方法がある。

  • 実装部を含む該当ファイルを全てプロジェクトに追加する。
  • 実装ファイル(.cpp)を include する(ヘッダ include の直後あたりに記述)。

どちらもあまり美しくないが、一応これで解決はする。

もっと良い方法ないかなぁ。

備考

クラスの場合、ヘッダにインラインで書かないで別の実装部を記述する場合は、

クラス名::メンバ名(メソッド名)

という記述をする必要がある。


プログラム・開発系メモ


トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-05-15 (土) 12:08:13 (5088d)