我正在尝试在 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 目录以包含目录(在 VC++ 目录下的属性页面下)
- 将 boost lib 目录添加到 Linker -> General -> Additional library dependencies
有关信息,我正在 Win32 上编译一个多线程调试 dll。
我花了一天的大部分时间谷歌搜索无济于事,所以非常感谢任何帮助!
非常感谢 :)