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
选项时,我收到此错误。
单独所有项目都在成功构建,但是当我构建主项目时,它会显示上述错误。
如何解决这个问题?
我非常烦恼。
答案 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)
当我们具有两个头文件的相同定义并在主文件中使用时,会发生此错误
当两个头文件中的变量和函数名称不同时,此错误将解决。