VC8到VC10 - LNK2005错误

bad*_*err 11 c++ linker visual-studio-2010

我最近安装了Visual Studio 2010并使用CMake为我的项目生成解决方案文件.此过程以前在VS2005上运行良好.

我遇到的第一个问题是因为新的"移动构造函数",所以我不得不从我的代码中删除一些隐式转换 - 公平,现在可行.

我目前的情况如下:我正在编译DLL 1,它只依赖于某些系统库(Kernel32等)和CRT,以及链接到DLL 1的DLL 2,以及一些第三方库.

我得到的错误是:

DLL1.lib(DLL1.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 objFromDLL2.obj
Run Code Online (Sandbox Code Playgroud)

这似乎正是这里描述的问题.

但是,此线程中没有任何内容可以解决我的问题.

  • 我已经确认DLL1和DLL2都是用/ MD代码生成标志编译的,
  • DLL2链接到squish,glew和devil - 我已经手动重新编译了所有这些以及它们依赖于 VC10的任何库,还有/ MD
  • 编辑根据这篇文章(类似于我的问题),我删除了从std :: containers派生的任何类的实例
  • 编辑我已经确认这不是第三方问题,因为我已使用同一组库成功编译了另一个项目,但是我仍然无法编译我的原始项目
  • 编辑 dllexport正在我的代码中的所有必需位置使用

我错过了什么?如果我需要提供更多信息,请告诉我,我会尽我所能编辑问题.

更新:已经有一段时间了,我仍然没有解决方案.我一直在用评论的回复来更新问题,我正在研究一个可行的不同代码库 - 我开始认为旧代码的向后兼容性终于开始枯竭,我应该只是继续.

更新:我发现了什么可能是一个非常不受欢迎的链接器标志,/ FORCE:MULTIPLE,它通过忽略除符号的第一个定义之外的所有内容将错误转换为警告.这样做必然会产生不良副作用.对此标志的测试突出显示了LNK2001:未解析的std :: string :: npos,它隐藏在所有先前的LNK2005错误中.折磨永无止境.

MSa*_*ers 0

我倾向于认为你所说的假设是不正确的。特别是,“DLL 1,仅依赖于某些系统库(Kernel32 等)”如果使用 /MD 编译并引用std::string::~string. 这显然会导致对 CRT 的依赖。

另外,如果 DLL1 不依赖于 DLL2,链接器到底如何知道来自 DLL2 的文件?!您是否设法建立了循环依赖关系?

在VS2008和VS2010之间,似乎已经std::string::~string从CRT中删除了。因此,它不再是您自己代码的 DLL 导入。这可以解释行为上的差异。DLL1 和 DLL2 之间的循环依赖关系并不重要,std::string::~string因为两者都会从 CRT 获取它,而这显然不会成为循环的一部分。