已在lib中定义的标准库,导致链接器错误

时间:2011-12-14 00:48:09

标签: c++ linker lnk2005

不确定我在这里做错了什么,但是说我有:

foo.h中

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

Foo.cpp中

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

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

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

我收到链接器错误说:

  

错误1错误LNK2005:“public:__ thishisall   的std :: _ Container_base12 ::〜_Container_base12(无效)”   (?? 1_Container_base12 @std @@ QAE @ XZ)已定义于   foo.lib(foo.obj)C:\ foo \ msvcprtd.lib(MSVCP100D.dll)footest

为什么会发生这种情况?

2 个答案:

答案 0 :(得分:22)

  

错误1错误LNK2005:“public:__ thishisall   的std :: _ Container_base12 ::〜_Container_base12(无效)”   (?? 1_Container_base12 @std @@ QAE @XZ)已在foo.lib(foo.obj)中定义   C:\ foo \ msvcprtd.lib(MSVCP100D.dll)footest

从我所看到的,此错误消息表示您尝试包括两次MSVC运行时库。这可能是由于使用运行时库选项编译foo.lib的结果:“多线程(/ MT)”和带有选项的测试项目:“多线程DLL(/ MD)”,例如

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

答案 1 :(得分: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