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に書いた派生クラスが継承していました。

ライブラリではビルドが通ってしまうのが厄介なところですね。
リンクエラーの絶望感は半端ないっすからね!!

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です