您的位置:首页 > 其它

长见识了,VS链接中的重定义错误

2010-09-27 19:50 169 查看
今天在编写一个程序,这个程序由四个模块组成,最终分别生成四个动态链接库,前三个很顺利的完成了,可是到了最后一个,错误出现了。

编译完全正确,可是Link时报以下错误:

msvcprtd.lib(MSVCP71D.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(char const *)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z) 已经在 utils.obj 中定义
msvcprtd.lib(MSVCP71D.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::~basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(void)" (??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) 已经在 utils.obj 中定义


看了一下utils.cpp文件,内容如下:

#include "Utils.h"
#include <sstream>
void KFS::GetTimeval(const std::string& s, TIMEVAL &tv)
{
if (s != "") {
std::istringstream ist(s);
ist >> tv.tv_sec;
ist >> tv.tv_usec;
} else {
tv.tv_sec = tv.tv_usec = 0;
}
}


怀疑是istringstream出了问题,遂注释掉GetTimeval中所有语句,出现了另外一个错误:

1>libcpmtd.lib(cout.obj) : error LNK2019: unresolved external symbol _CrtDbgReportW referenced in function "public: char const & __cdecl std::_String_const_iterator<char,struct std::char_traits<char>,class std::allocator<char> >::operator*(void)const " (??D?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAAEBDXZ)


难道是cout出错??更是摸不到头脑。突然想起来再编译第三个DLL的时候,曾经加了/NODEFAULTLIB:libcpmtd.lib参数,那么是不是这个lib的问题呢。

搜到了这个帖子:http://read.newbooks.com.cn/info/179811.html

发现原来这个库并不总是链接时的默认库,而只有在设置/MTd的时候才会调用该lib,而且由于/MTd引起的错误多以“重定义”的形式存在。

解决:

只要将一个“解决方案”中的所有项目都设置成/MD参数,就不会出现类似重定义的错误了,vs中设置方法如下:

项目->属性->配置属性->C/C++->代码生成->运行时库,其中可以选择设置属性。具体每一个属性的意义请参考:

http://read.newbooks.com.cn/info/179811.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐