长见识了,VS链接中的重定义错误
2010-09-27 19:50
169 查看
今天在编写一个程序,这个程序由四个模块组成,最终分别生成四个动态链接库,前三个很顺利的完成了,可是到了最后一个,错误出现了。
编译完全正确,可是Link时报以下错误:
看了一下utils.cpp文件,内容如下:
怀疑是istringstream出了问题,遂注释掉GetTimeval中所有语句,出现了另外一个错误:
难道是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
编译完全正确,可是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
相关文章推荐
- VS报错 error LNK2005: _DllMain@12 已经在 MSVCRTD.lib(dllmain.obj) 中定义 链接报错: 错误 33 error LNK2005: _DllMai
- vs.net 中编译链接vc工程时的LNK171@mspdb140.dll错误处理
- 为什么会出现LNK2005"符号已定义"的链接错误?
- 使用STL时的一个链接错误(error LNK2005:std::_Lockit::_Lockit(int)重定义)
- vs 2005链接时错误的解决方案 error LNK2019: unresolved external symbol __security_cookie referenced in function
- 如果一个程序同时链接了MSVCRT.lib和libcmt.lib回出现函数重定义错误
- C++模板定义与实现分离所导致的链接错误LNK2019
- 为什么会出现LNK2005"符号已定义"的链接错误?
- LNK2005"符号已定义"的链接错误
- 使用vs编译出现 ”error LNK1169: 找到一个或多个多重定义的符号“的错误
- VS2013+opencv2.4.13测试surf特征匹配时报未定义标识符错误
- 【转】为什么会出现LNK2005"符号已定义"的链接错误?
- VS编译链接时错误(Error Link2005)的解决方法
- 编译和链接 - 解决出现的LNK2005“符号已定义”错误 1
- VS链接错误:LNK1169
- vs中运行项目出现“*** 已经在libcmtd.lib中定义”的错误
- 为什么会出现LNK2005"符号已定义"的链接错误?
- 编译和链接 - 解决出现的LNK2005“符号已定义”错误 2
- VS编译Qt时若主函数为wmain时出现链接错误,找不到main入口函数
- 注意头文件规则,避免链接错误:重复定义(multiple defination)