C ++ Visual Studio 2012让Box2D和SFML协同工作

时间:2013-06-18 20:44:29

标签: c++ box2d linker-errors sfml

基本上我试图让SFML和Box2D在VS2012下一起工作。 我让他们两个独立工作,但我不能让他们一起工作。

如果我尝试一起运行它们,我会得到一堆:

error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MDd_DynamicDebug' doesn't match value 'MTd_StaticDebug' in Main.obj

如果我将属性中的RuntimeLibrary值从MDd更改为MTd,则会出现一堆错误,例如:

error LNK2005: __amsg_exit already defined in MSVCRTD.lib(MSVCR110D.dll)
error LNK2005: __cexit already defined in MSVCRTD.lib(MSVCR110D.dll)
error LNK2005: __exit already defined in MSVCRTD.lib(MSVCR110D.dll)

一堆那些以及两个警告:

 warning LNK4098: defaultlib 'MSVCRTD' conflicts with use of other libs; use /NODEFAULTLIB:library` 
 warning LNK4098: defaultlib 'libcmtd.lib' conflicts with use of other libs; use /NODEFAULTLIB:library

如果我也不起作用,我会得到一堆类似于以下的错误:

error LNK2001: unresolved external symbol __purecall

对于SFML,我绝对肯定我是正确的。另一方面,对于Box2D,我不太确定。我使用了this guide,你可以看到它适用于VS2010。但是我在构建和HelloWorld.cpp示例时没有遇到任何错误。

那么我可以做些什么才能使这项工作成功?

编辑:我已经开始工作,但只适用于调试版本 我做的是我尝试将Box2D库重建为/ MTd用于调试和/ MT用于发布 调试版本很好,而Release版本没有。
调试版本工作正常,但发布版本抛出

warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library

和错误几乎与本文中的第二个错误列表相同

对此有何解决方案?

EDIT_2:似乎问题出在dll文件中。我重建了SFML,现在它似乎正在工作。我稍后会做一些测试,以确定我是否已修复它。

1 个答案:

答案 0 :(得分:6)

所以我解决了这个问题。

首先要做的事情。如果你得到一堆链接器错误,那么你可能在链接库时搞砸了一些东西。检查IDE中的链接器设置。

我搞砸的是,我正在更改项目属性中的运行时库值 - > C / C ++ - > Visual Studio 2012中的代码生成设置(出于某种未知原因)。这导致了众多的链接器错误。

在我最终修复了我的应用程序编译成功之后,但是在尝试运行它时我得到了:

The application was unable to start correctly (0xc000007b). Click OK to close the application

这看起来是错误的.dll文件。我使用CMake重建了最新的SFML2,然后在VS2012中重建了lib和dll,现在一切正常。

我仍然不确定是什么原因导致他们在第一时间停止正常工作,因为之前我使用过这些相同的.dll文件,他们突然开始把这个错误扔给我。

我可以收集的(0xc000007b)可以链接到:

  

问题是由于Visual Studio所需的各种系统dll的32/64位不匹配。不知何故,它需要的dll被无法加载的64位版本所取代。

来源:MSDN forum

所以这可能是我的问题。

那么我从中学到了什么:

  1. 不要弄乱你不完全理解的事情
  2. 如果您在构建过程中遇到任何错误,请不要浏览它们,全部阅读,因为几乎总会有一些关于您的问题的有用信息
  3. 如果您决定自己构建库,或者没有其他选择,只能自己构建它们,那么请确保正确遵循说明(如果有的话,则授予)并始终在尝试将多个库链接在一起之前运行单独的测试否则你会为错误归咎于错误的库