#freeze
 * 意味不明なリンカエラー (1) [#g30fff8b]
 
 VC++(.NET)で、コンパイルは通るのに、リンカでエラーになる。
 VC++(.NET)で、コンパイルは通るのに、リンクでエラーになる。
 
  hoge.obj : error LNK2001: 外部シンボル "(シンボル名)" (C++でのシンボル名?)" は未解決です。
 
 C++ でのシンボル名というのは "??メソッド名や名前空間を@@でつないだような文字列" みたいなやつ。
 
 [[Microsoft の説明:http://www.microsoft.com/japan/developer/library/vccore/lnk2001.htm]]を見ると、これは、
 
 シンボル名は宣言されているが、実装がない(見つからない)
 
 ケースが多いだろうと。つまり、
 
 - シンボル名(関数名など)は宣言されているが、実装が宣言と違う(引数リストとか型とか)。
 - シンボル名は宣言されているが、実装がない。
 
 というパターンになるだろうなぁと。
 
 前者の間違いは比較的発見しやすいが、後者の場合にハマることが多い。
 つまり、宣言通りに実装している(はずである)のに、リンカが「実装がない」と怒っていると。
 ちゃんと探せよボケリンカ!といいたくなるエラー。
 
 宣言はヘッダー(.h)に書いて、実装を別のファイル(.cpp など)に書く場合、
 かつ、それらのソースが同じプロジェクトに含まれていない場合に、
 そのヘッダのみを include して使おうとしたときに、
 リンカがこの実装を見つけてくれないというパターンが多い。
 
 この場合、次の解決方法がある。
 
 - 実装部を含む該当ファイルを全てプロジェクトに追加する。
 - 実装ファイル(.cpp)を include する(ヘッダ include の直後あたりに記述)。
 
 どちらもあまり美しくないが、一応これで解決はする。
 
 
 もっと良い方法ないかなぁ。
 
 
 *** 備考 [#a41a3b83]
 クラスの場合、ヘッダにインラインで書かないで別の実装部を記述する場合は、
 
  クラス名::メンバ名(メソッド名)
 
 という記述をする必要がある。
 
 -----
 [[プログラム・開発系メモ]]
 
 

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS