首页 文章

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

提问于
浏览
5

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

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:__thiscall std :: _ Container_base12 ::〜_Container_base12(void)”(?? 1_Container_base12 @std @@ QAE @XZ)已经在foo.lib(foo.obj)中定义了C:\ foo \ msvcprtd.lib(MSVCP100D.dll)footest

任何想法为什么会这样?

2 回答

  • 21

    错误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)footest

    从我所看到的,此错误消息意味着您尝试包括两次MSVC运行时库 . 这可能是由于使用运行时库选项编译 foo.lib 的结果:"Multi-threaded (/MT)"和带有选项的测试项目:例如"Multi-threaded DLL (/MD)" .

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

  • 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

相关问题