VC全般 LNK2001リンクエラーの回避策
環境
(環境依存なし)
Windows8.1
VC2013
現象
リンクエラーって難しいですよね。
コンパイルが通ってるから行数の特定も難しいですし。
先日「リンクエラー:LNK2001」が出て、同僚が悩んでいたので一緒に見てました。
MSDNでは難しい説明がずらりと…
(参考:リンカ ツール エラー LNK2001)
けど、そんなに難しいことはしてないんです。
原因
以下のようなコードを書いていました。
#include <iostream> using namespace std; class BaseClass { public: virtual void func(); }; class DerivedClass : public BaseClass { public: void func(){ cout << "func called."; }; }; int main() { DerivedClass dc; dc.func(); return 0; }
なんとなく通りそうな気がしますが、LNK2001が発生します。
BaseClassに着目すると、funcが仮想関数になっていて実装がありませんでした。
話を聞くと、純粋仮想関数を作りたかったみたいです!!
と言うことは
class BaseClass { public: virtual void func() = 0; };
これでOKじゃないか!
結論
「LNK2001:外部シンボル”xxxxxx”は未解決です。」が発生したら、
慌てず追加したコードを確認しましょう。
解決方法に書きましたが、純粋仮想関数を作るなら引数の後ろに=0を書きます。
仮想関数なら実装(定義)をちゃんと書きましょう。
追加調査
今回は、ライブラリに書いた基本クラスをDLLに書いた派生クラスが継承していました。
ライブラリではビルドが通ってしまうのが厄介なところですね。
リンクエラーの絶望感は半端ないっすからね!!