将开发环境从Visual Studio 2003移植到2010:为什么我会收到LNK2005错误
Porting development environment from Visual Studio 2003 to 2010: why am I getting LNK2005 errors?
我目前有两个DLL库-CMN和GT。GT依赖于CMN。
在VisualStudio2003中,我可以毫无问题地编译和链接这两个库。我可以在Visual Studio 2010中成功编译CMN和GT,并链接CMN。然而,如果我试图链接GT,我会得到以下错误:
CMN.lib(CMN.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) already defined in TokenizerAdvanced.obj
CMN.lib(CMN.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) already defined in TokenizerAdvanced.obj
CMN.lib(CMN.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) already defined in TokenizerAdvanced.obj
CMN.lib(CMN.dll) : error LNK2005: "public: void __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::reserve(unsigned int)" (?reserve@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXI@Z) already defined in TokenizerAdvanced.obj
CMN.lib(CMN.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> >::erase(unsigned int,unsigned int)" (?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@II@Z) already defined in TokenizerAdvanced.obj
TokenizerAdvanced是GT.中的一个源文件
所有编译和链接都使用相同的命令行结构完成(使用-MDd进行编译)。Visual Studio 2003和2010之间发生了什么变化,会导致此问题?
编辑:奇怪的是,如果我从构建中排除TokenizerAdvanced.cpp(另一个文件-Tokenizer.cpp没有引用它),我会得到一个未解决的外部错误:
Tokenizer.obj : error LNK2001: unresolved external symbol "public: static unsigned int const std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::npos" (?npos@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@2IB)
编辑:将调查移至答案。
我想我已经找到问题了。我们有从CMN中的字符串派生的类。请参见此处。
此讨论建议在客户端库源代码中添加以下内容:
template std::string::size_type std::string::npos;
template std::wstring::size_type std::wstring::npos;
但这并没有解决我的问题。
这次讨论建议更改任何从字符串派生的类(我注意到我们的代码在一些地方这样做),改为使用包含,这就是我最终所做的。这解决了问题。
相关文章:
- 为什么当我在Visual c ++ studio 2010中运行应用程序时光标会转到最后一个文本框
- 为什么安装 VSTS 2010 SP1 后找不到 Ws2_32.lib
- 这个过剩的球体不会旋转,为什么?使用 Visual C++ 2010
- 为什么Folloing代码在2010年Visual Studio(X64应用程序)中抛出非法指令例外
- 为什么Visual Studio 2010寻找__thiscall而不是__cdecl调用约定
- 为什么Visual Studio 2010(Intellisense)会停止生成接口指针
- 为什么Visual Studio 2010编译器不知道__func_
- 为什么在VS 2010 C++中,我的程序在调试器中运行良好时会崩溃,但在没有调试器的情况下运行时会崩溃
- 为什么我得到错误C1033:无法打开VS 2010中的程序数据库
- 当向量被破坏且_ITERATOR_DEBUG_LEVEL=0时,为什么Visual C++2010仍在调用Orphan_
- 为什么一个C++ MFC "empty"项目占用 142MB 和一个 6MB 的可执行文件?(Visual Studio 2010)
- 为什么以下内容无法在Visual Studio 2010 C++下编译
- 为什么VC++ 2010 Express在这个程序中不需要stdio.h,而gcc++需要?
- 为什么VC++ 2010允许编译
- 为什么vsc++2010编译器会为类似的函数生成不同的汇编代码
- 将开发环境从Visual Studio 2003移植到2010:为什么我会收到LNK2005错误
- 为什么 Visual Studio 2010 调试器看不到静态 const 类成员?
- 为什么我得到一个小绿色破折号和绿色盒子在我的代码在MVS 2010
- VS 2010 - #pragma 注释(lib,XX)有效,其他依赖项无效。为什么?
- 为什么MSVS 2010 MFC项目依赖于MSVS 2008的vcredist_x86.exe