vc2008升级到vc2010后出现链接失败问题,是微软的bug?

时间:2022-08-27 20:00:05
我把vc从2008升级到2010后编译以前的项目,出现下面的编译错误。
在网上google后最多的解释是使用了vc08和vc10交叉编译的库导致。我的程序和动态库只使用了boost,于是又用一台全新安装的电脑上只装了vc2010从新编译了boost和我的程序以及动态库,结果错误同样出现了。
难道这是微软的bug?或者vc2010做了一些我不知道的标准修改?

错误信息如下:

1>------ 已启动生成: 项目: LoginServer, 配置: Debug Win32 ------
1>生成启动时间为 2010/11/1 10:19:53。
1>InitializeBuildStatus:
1>  正在对“Win32\Debug\LoginServer.unsuccessfulbuild”执行 Touch 任务。
1>ClCompile:
1>  所有输出均为最新。
1>ManifestResourceCompile:
1>  所有输出均为最新。
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(990,5): warning MSB8012: TargetPath(D:\workspace\flyant\flyant_frame\LoginServer\Win32\Debug\LoginServer.exe) 与 Linker 的 OutputFile 属性值(D:\workspace\flyant\flyant_frame\output\Win32\Debug\LoginServer.exe)不匹配。这可能导致项目生成不正确。若要更正此问题,请确保 $(OutDir)、$(TargetName) 和 $(TargetExt) 属性值与 %(Link.OutputFile) 中指定的值匹配。
1>OSCore.lib(oscore.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) 已经在 linkboost.obj 中定义
1>OSCore.lib(oscore.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)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) 已经在 linkboost.obj 中定义
1>OSCore.lib(oscore.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) 已经在 linkboost.obj 中定义
1>OSCore.lib(oscore.dll) : error LNK2005: "public: char const * __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::c_str(void)const " (?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPBDXZ) 已经在 linkboost.obj 中定义
1>OSCore.lib(oscore.dll) : error LNK2005: "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::operator+=(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (??Y?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@ABV01@@Z) 已经在 linkboost.obj 中定义
1>OSCore.lib(oscore.dll) : error LNK2005: "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::operator+=(char const *)" (??Y?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@PBD@Z) 已经在 linkboost.obj 中定义
1>OSCore.lib(oscore.dll) : error LNK2005: "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::operator=(char const *)" (??4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@PBD@Z) 已经在 linkboost.obj 中定义
1>OSCore.lib(oscore.dll) : error LNK2005: "public: bool __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::empty(void)const " (?empty@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE_NXZ) 已经在 linkboost.obj 中定义
1>OSCore.lib(oscore.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> >(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV01@@Z) 已经在 linkboost.obj 中定义
1>OSCore.lib(oscore.dll) : error LNK2005: "public: unsigned int __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::size(void)const " (?size@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIXZ) 已经在 linkboost.obj 中定义
1>OSCore.lib(oscore.dll) : error LNK2005: "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::append(char const *,unsigned int)" (?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBDI@Z) 已经在 linkboost.obj 中定义
1>OSCore.lib(oscore.dll) : error LNK2005: "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::assign(char const *,unsigned int)" (?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBDI@Z) 已经在 linkboost.obj 中定义
1>OSCore.lib(oscore.dll) : error LNK2005: "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::append(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@ABV12@@Z) 已经在 linkboost.obj 中定义
1>OSCore.lib(oscore.dll) : error LNK2005: "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::append(char const *)" (?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBD@Z) 已经在 linkboost.obj 中定义
1>OSCore.lib(oscore.dll) : error LNK2005: "public: __thiscall std::_String_val<char,class std::allocator<char> >::~_String_val<char,class std::allocator<char> >(void)" (??1?$_String_val@DV?$allocator@D@std@@@std@@QAE@XZ) 已经在 linkboost.obj 中定义
1>OSCore.lib(oscore.dll) : error LNK2005: "public: void __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::_Tidy(bool,unsigned int)" (?_Tidy@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEX_NI@Z) 已经在 linkboost.obj 中定义
1>OSCore.lib(oscore.dll) : error LNK2005: "public: __thiscall std::_String_val<char,class std::allocator<char> >::_String_val<char,class std::allocator<char> >(class std::allocator<char>)" (??0?$_String_val@DV?$allocator@D@std@@@std@@QAE@V?$allocator@D@1@@Z) 已经在 linkboost.obj 中定义
1>..\output\Win32\Debug\LoginServer.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
1>
1>生成失败。
1>
1>已用时间 00:00:00.73
========== 生成: 成功 0 个,失败 1 个,最新 2 个,跳过 0 个 ==========

7 个解决方案

#1


不好说。
围观。

#2


linkboost是什么,看起来定义了string

#3


该符号为封装函数(通过用 /Gy 编译创建),包含在多个文件中,但在各编译间已改变。重新编译所有包含 symbol 的文件。

怀疑是这个原因

#4


dll和exe 使用相同的编译选项 再试试。

#5


相关的几个源文件,同样的源文件在vc2008里编译可以通过的。

///////////////////////////////////////////////////////////////////////
//IncludeBoost.hpp
#pragma once
#ifndef OS_BOOST_LINK_LIB
//这里不链接boost库
# define BOOST_ALL_NO_LIB
#endif//OS_BOOST_LINK_LIB

//显示链接的boost库文件名
#define BOOST_LIB_DIAGNOSTIC
//动态链接
#define BOOST_ALL_DYN_LINK

#pragma warning(disable : 4251)
#pragma warning(disable : 4275)
#pragma warning(disable : 4819)

#include "boost/any.hpp"
#include "boost/program_options.hpp"
#include "boost/format.hpp"
#include "boost/smart_ptr.hpp"
#include "boost/asio.hpp"
#include "boost/thread.hpp"
#include "boost/filesystem.hpp"
#include "boost/regex.hpp"
#include "boost/signals.hpp"
#include "boost/type_traits/function_traits.hpp"
#include "boost/bind.hpp"
#include "boost/crc.hpp"

//实现_bind_t的比==操作符
template <class R1,class F1,class L1,class R2,class F2,class L2>
bool operator == (const boost::_bi::bind_t<R1,F1,L1>& v1,const boost::_bi::bind_t<R2,F2,L2>& v2)
{
return false;
}

template <class R,class F,class L>
bool operator == (const boost::_bi::bind_t<R,F,L>& v1,const boost::_bi::bind_t<R,F,L>& v2)
{
return v1.compare(v2);
}

///////////////////////////////////////////////////////////////////////
//linkboost.hpp
#pragma once

#ifndef OS_BOOST_LINK_LIB
# define OS_BOOST_LINK_LIB
#endif//OS_BOOST_LINK_LIB

#include "oscore/includeboost.hpp"

#undef OS_BOOST_LINK_LIB

///////////////////////////////////////////////////////////////////////
//linkboost.cpp
#include "OSCore/InludeBoost.hpp"
#include "oscore/LinkBoost.hpp"

#6


有新情况,使用2010新建项目文件后编译就通过了,奇怪啊。哪位知道原因。

#7


看来应该是编译选项的原因了,散分了。

#1


不好说。
围观。

#2


linkboost是什么,看起来定义了string

#3


该符号为封装函数(通过用 /Gy 编译创建),包含在多个文件中,但在各编译间已改变。重新编译所有包含 symbol 的文件。

怀疑是这个原因

#4


dll和exe 使用相同的编译选项 再试试。

#5


相关的几个源文件,同样的源文件在vc2008里编译可以通过的。

///////////////////////////////////////////////////////////////////////
//IncludeBoost.hpp
#pragma once
#ifndef OS_BOOST_LINK_LIB
//这里不链接boost库
# define BOOST_ALL_NO_LIB
#endif//OS_BOOST_LINK_LIB

//显示链接的boost库文件名
#define BOOST_LIB_DIAGNOSTIC
//动态链接
#define BOOST_ALL_DYN_LINK

#pragma warning(disable : 4251)
#pragma warning(disable : 4275)
#pragma warning(disable : 4819)

#include "boost/any.hpp"
#include "boost/program_options.hpp"
#include "boost/format.hpp"
#include "boost/smart_ptr.hpp"
#include "boost/asio.hpp"
#include "boost/thread.hpp"
#include "boost/filesystem.hpp"
#include "boost/regex.hpp"
#include "boost/signals.hpp"
#include "boost/type_traits/function_traits.hpp"
#include "boost/bind.hpp"
#include "boost/crc.hpp"

//实现_bind_t的比==操作符
template <class R1,class F1,class L1,class R2,class F2,class L2>
bool operator == (const boost::_bi::bind_t<R1,F1,L1>& v1,const boost::_bi::bind_t<R2,F2,L2>& v2)
{
return false;
}

template <class R,class F,class L>
bool operator == (const boost::_bi::bind_t<R,F,L>& v1,const boost::_bi::bind_t<R,F,L>& v2)
{
return v1.compare(v2);
}

///////////////////////////////////////////////////////////////////////
//linkboost.hpp
#pragma once

#ifndef OS_BOOST_LINK_LIB
# define OS_BOOST_LINK_LIB
#endif//OS_BOOST_LINK_LIB

#include "oscore/includeboost.hpp"

#undef OS_BOOST_LINK_LIB

///////////////////////////////////////////////////////////////////////
//linkboost.cpp
#include "OSCore/InludeBoost.hpp"
#include "oscore/LinkBoost.hpp"

#6


有新情况,使用2010新建项目文件后编译就通过了,奇怪啊。哪位知道原因。

#7


看来应该是编译选项的原因了,散分了。