9

不知道我在这里做错了什么,但说我有:

foo.h

class foo
{
public:
int Get10(std::wstring);
};

foo.cpp

int foo::Get10(std::wstring dir)
{
   return 10;
};

我将它编译为一个库,如果我将该库与相关头文件(foo.h)一起包含在另一个项目中并尝试调用 foo 的实例:

foo f;
f.Get10(L"ABC");

我收到一个链接器错误说:

错误 1 ​​错误 LNK2005: "public: __thiscall std::_Container_base12::~_Container_base12(void)" (??1_Container_base12@std@@QAE@XZ) 已经在 foo.lib(foo.obj) C:\foo\msvcprtd 中定义.lib(MSVCP100D.dll) 脚注

任何想法为什么会发生这种情况?

4

2 回答 2

27

错误 1 ​​错误 LNK2005: "public: __thiscall std::_Container_base12::~_Container_base12(void)" (??1_Container_base12@std@@QAE@XZ) 已经在 foo.lib(foo.obj) C:\foo\msvcprtd 中定义.lib(MSVCP100D.dll) 脚注

据我所知,此错误消息意味着您尝试包含 MSVC 运行时库两次。这可能是由于foo.lib使用运行时库选项编译的结果:“多线程 (/MT)”和带有选项的测试项目:“多线程 DLL (/MD)”。

检查两个项目的“项目属性”==>“C/C++”==>“代码生成”下的运行时选项,并确保它们对于两个项目都是相同的。

于 2011-12-14T02:54:29.460 回答
0

您是否在任何 .h 文件中包含 foo.h ?您可能需要添加标头保护以确保每个文件不会多次定义该类:

#ifndef FOO_H_
#define FOO_H_

class foo
{
 public:
  int Get10(std::wstring);
}

#endif  // FOO_H_

另见:http ://en.wikipedia.org/wiki/Include_guard

于 2011-12-14T01:06:37.003 回答