【问题标题】:standard library already defined in lib, causing linker error标准库已在 lib 中定义,导致链接器错误
【发布时间】:2012-01-19 20:41:32
【问题描述】:

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

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

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

【问题讨论】:

  • 您是否尝试在类定义后添加分号;
  • 是的,在源文件中哈哈,我把它放在我放在这里的东西之外是不好的。

标签: c++ linker lnk2005


【解决方案1】:

错误 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++”==>“代码生成”下的运行时选项,并确保它们对于两个项目是相同的。

【讨论】:

  • "带有运行时库选项:多线程 (/MT) 和带有选项的测试项目:例如多线程 DLL (/MD)。"宾果游戏,就是这样(来这里发布的)
  • 我之前遇到过同样的问题,所以当你发布该错误时我知道发生了什么:)
  • 另一个问题是相关的:stackoverflow.com/questions/4917592/…
  • 有时 C++ 错误消息让我大吃一惊,因为它们是多么模棱两可。这就是为什么我将 C# 用于我的主要代码库,而 C++ 仅用于组件。
  • @ksming 我有这些设置和错误。但是如何在 Visual Studio GUI 中更改它们?
【解决方案2】:

您是否在任何 .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

【讨论】:

  • 你能把你正在使用的所有函数的完整源码和命令行包括进来吗?
猜你喜欢
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2012-10-06
  • 1970-01-01
  • 2016-03-09
  • 2022-01-13
  • 1970-01-01
  • 2020-05-14
相关资源
最近更新 更多