2

基本上我试图让 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,我不太确定。我使用了本指南,您可以看到它适用于 VS2010。但是,我在构建时没有出错,HelloWorld.cpp 示例运行时没有任何问题。

那么我能做些什么来完成这项工作吗?

编辑:我已经让它工作了,但是仅适用于调试版本我所做的是我尝试将 Box2D 库重建为 /MTd 用于调试和 /MT 用于发布 调试一个构建良好,而发布版本没有。
调试版本工作正常,但发布版本抛出

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

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

有什么解决办法吗?

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

4

1 回答 1

6

所以我修复了它,这就是方法。

第一件事。如果你得到一堆链接器错误,那么你可能在链接库时搞砸了。检查 IDE 中的链接器设置。

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

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

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

事实证明这是错误的 .dll 文件。我已经使用 CMake 重建了最新的 SFML2,然后在 VS2012 中重建了库和 dll,现在一切正常。

我仍然不确定是什么导致它们首先停止正常工作,因为我之前使用过这些相同的 .dll 文件,它们突然开始向我抛出该错误。

从我可以收集到的内容(0xc000007b)可能与:

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

来源:MSDN 论坛

所以这可能是我的问题。

那么我从中学到了什么:

  1. 不要摆弄你不完全理解的东西
  2. 如果您在构建过程中遇到任何错误,不要只是浏览它们,而是要阅读它们,因为几乎总会有一些关于您的问题的有用信息
  3. 如果您决定自己构建库,或者除了自己构建它们别无选择,那么请确保正确遵循说明(如果有的话)并始终在尝试将多个库链接在一起之前运行单独的测试,否则您'重新将你的错误归咎于错误的图书馆
于 2013-06-20T09:58:08.913 回答