如何在Visual Studio中解决链接错误2005?

时间:2009-05-28 14:02:07

标签: c++ visual-studio-2005 linker

error LNK2005: "public: __thiscall std::basic_ostream<char,struct std::char_traits<char> >::basic_ostream<char,struct std::char_traits<char> >(class std::basic_streambuf<char,struct std::char_traits<char> > *,bool)" (??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits
@D@std@@@1@_N@Z) already defined in msvcprtd.lib(MSVCP80D.dll)  libcpmtd.lib

当我尝试在子项目中包含/clr选项和/MDd选项时,我收到此错误。

单独所有项目都在成功构建,但是当我构建主项目时,它会显示上述错误。

如何解决这个问题?

我非常烦恼。

5 个答案:

答案 0 :(得分:1)

确保使用相同的运行时库编译所有单个项目,具体如下:

Properties -> C/C++ -> Code Generation -> Runtime Library

如果您使用/MDd,请确保所有其他项目也是如此。否则,当您在主项目中将它们全部链接在一起时,它将导入多个版本的运行时库,从而导致您观察到的错误。

答案 1 :(得分:0)

看起来你正在将静态编译的lib与dll链接起来? msvcprtd.lib是使用STL进行编译时链接的/MDd的静态库。

Libcmptd.lib是CRT库,在您指定/MTd时会使用它。

See here,其中libs由哪个设置使用。

检查您的构建设置,使它们完全相同。

答案 2 :(得分:0)

链接器说他看到了在多个目标文件/库中定义的符号。

尝试找出哪些导出它(例如使用dumpbin),找出原因(是静态链接的标准库?)以及是否需要它。

对于这个具体案例:

此操作符既提供内联(使您的项目定义它),也提供为msvcprtd.dll的导出。您可以通过将符号声明为__declspec(dllimport)来解决此问题。

答案 3 :(得分:0)

使用动态或静态链接运行时库:

LIBCPMTD.LIB - 多线程,静态链接

MSVCPRTD.LIB - 多线程动态链接(MSVCP80D.DLL的导入库)

答案 4 :(得分:0)

当我们具有两个头文件的相同定义并在主文件中使用时,会发生此错误
当两个头文件中的变量和函数名称不同时,此错误将解决。