VS2010 で他の人のコードをビルドしようとしています。VS2005 では問題なくビルドできますが、アップグレードする必要があります。
彼らはヘッダーで次のようにマクロを定義しました:
#include <boost/scoped_ptr.hpp>
#include <boost/utility.hpp>
#include <boost/thread/once.hpp>
#define DEFINE_SINGLETON(name) boost::scoped_ptr<name> Singleton<name>::_instance
template<class T> class Singleton : private boost::noncopyable
{
public:
static T& instance()
{
boost::call_once(init, flag);
return *_instance;
}
static void init()
{
_instance.reset(new T());
}
protected:
Singleton() {}
~Singleton() {}
private:
static boost::scoped_ptr<T> _instance;
static boost::once_flag flag;
};
template<class T> boost::once_flag Singleton<T>::flag = BOOST_ONCE_INIT;
コードをビルドすることができましたが、このマクロに関して多くのリンカ エラーが発生しています。
project1.lib(file1.obj) : error LNK2001: unresolved external symbol "private: static class boost::scoped_ptr<class ClassABC> Singleton<class ClassABC>::_instance" (?_instance@?$Singleton@VClassABC@@@@0V?$scoped_ptr@VClassABC@@@boost@@A)
使用されているマクロの例 (ソース ファイル内):
#include "singleton.h"
DEFINE_SINGLETON(ClassABC);
私は Boost とテンプレート (申し訳ありません) にまったく慣れていないので、VS2005 ですべて正常にリンクされているのに、なぜこれらのエラーが発生するのか理解できません。注目に値するのは、アップグレードを行うために Boost バージョンもアップグレードする必要があったため、これが要因である可能性があります - いくつかのチェックが既に実行されています。
- ソースファイルにヘッダファイルをインクルード
- Boost dir が追加され、dirs が含まれるようになりました (VC++ dirs inproperty ページの下)。
- Boost lib dir をリンカーに追加 -> 一般 -> 追加のライブラリ依存関係
情報については、Win32 でマルチスレッド デバッグ DLL をコンパイルしています。
私は一日のほとんどを無駄にグーグルで過ごしたので、どんな助けも大歓迎です!
どうもありがとう :)