我正在构建一个带有子弹物理支持的Windows OpenGL应用程序。 我的开发环境设置是:
我的应用程序有两种配置,即 Win32 和 x64 。 这是构建Windows应用程序的步骤:
现在,当我为这两种配置构建我的解决方案(即 Win32 和 x64 的批量构建)时,除了以下内容之外,所有内容都正确构建:
x64发布 - 错误如:
BulletCollision_vs2010_x64_debug.lib(btDefaultCollisionConfiguration.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '2' doesn't match value '0' in stdafx.obj
Win32发布 - 错误如:
Win32_Window.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall btConvexInternalShape ...
Win32调试 - 错误如:
Win32_Window.obj : error LNK2019: unresolved external symbol "public: __thiscall btRigidBody
最终消息 - 构建:13成功,3失败
我正在按照这个帮助来构建我的Visual Studio项目:
注意:如果我使用CMAKE为BulletPhysics构建VisualStudio解决方案,然后将它们分别链接到我的Windows应用程序以用于每个CPU架构,那么它构建正确(即构建 Win32 和 x64 分开)。
有没有什么方法可以让我只使用一个Visual Studio解决方案?
答案 0 :(得分:3)
在x64 Release
中,您尝试将以调试模式(BulletCollision_vs2010_x64_
debug
.lib
)编译的静态库与您的目标文件相关联在发布模式下编译的应用程序(具体为stdafx.obj
)。目标文件的编译器选项(_ITERATOR_DEBUG_LEVEL
)和lib的编译器选项不匹配(值0
表示发布,2
表示调试。这就是链接失败的原因。在Win32 Debug
和Win32 Release
个案例中,您似乎根本没有链接库。
我认为项目引用方式错误。
在我看来,"项目参考"对于C#样式的模块是有好处的,在本机开发中它更像是不必要的复杂事物。只需将纯旧的库明确添加到链接器输入,如下所示:
..\..\lib\BulletDynamics_vs2010_x64_debug.lib
..\..\lib\BulletCollision_vs2010_x64_debug.lib
..\..\lib\LinearMath_vs2010_x64_debug.lib
更改"调试"和" x64"每个配置相应的部件。我认为它更可靠。
BulletDynamics
,BulletCollision
和LinearMath
添加到"项目依赖项"为您的应用程序项目。这将保证在您的应用程序之前构建项目符号。检查"构建订单"选项卡以确保构建顺序正确。Build->Configuration manager
>适用于所有"解决方案配置"以及所有"解决方案平台" (上面的下拉菜单)检查项目配置和平台是否正确。 (即,当您将解决方案切换到发布时,您没有使用调试的项目,反之亦然)