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

MrP*_*low 2 c++ linker-errors box2d sfml

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

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

error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MDd_DynamicDebug' doesn't match value 'MTd_StaticDebug' in Main.obj
Run Code Online (Sandbox Code Playgroud)

如果我将属性中的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)
Run Code Online (Sandbox Code Playgroud)

一堆那些以及两个警告:

 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
Run Code Online (Sandbox Code Playgroud)

如果我也不工作,我得到一堆类似的错误:

error LNK2001: unresolved external symbol __purecall

对于SFML,我非常肯定我正确地构建了它.另一方面,对于Box2D,我不太确定.我使用了本指南,你可以看到它适用于VS2010.但是我在构建和HelloWorld.cpp示例时没有遇到任何问题.

那么我可以做些什么来完成这项工作?

编辑:我已经让它工作,但只有调试版本我做的是我尝试重建Box2D库作为/ MTd进行调试和/ MT发布调试一个内置正常,而发布版本没有.
调试版本工作正常,但发布版本抛出

warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
Run Code Online (Sandbox Code Playgroud)

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

对此有何解决方案?

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

MrP*_*low 6

所以我修复了它,这是如何.

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

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

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

The application was unable to start correctly (0xc000007b). Click OK to close the application
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

资料来源:MSDN论坛

所以这可能是我的问题.

那么我从中学到了什么:

  1. 不要弄乱你不完全理解的事情
  2. 如果您在构建过程中遇到任何错误,请不要浏览它们,全部阅读,因为几乎总会有一些有关您的问题的有用信息
  3. 如果你决定建立自己的图书馆,或者没有别的选择,只能自己建立他们,然后一定要按照说明正确(授予如果有的话),并总是试图将多个库,否则连接在一起之前运行单项测试你"为了你的错误而责备错误的库