【问题标题】:build Bullet Physics for multiple architectures in Visual Studio在 Visual Studio 中为多种架构构建 Bullet Physics
【发布时间】:2014-08-13 11:22:14
【问题描述】:

我正在构建一个支持子弹物理的 Windows OpenGL 应用程序。 我的开发环境设置是:

  • 操作系统:Windows 7 SP1 64 位
  • IDE ; Visual Studio 2010 SP1
  • BulletPhysics - bullet-2.82-r2704

我的应用程序有两种配置,即 Win32 和 x64。 这是我构建 Windows 应用程序的步骤:

  1. 首先我在 "bullet-2.82-r2704\build" 中执行 vs2010.bat 文件。
  2. 我将第 1 步创建的 vs2010 文件夹中的项目文件添加到我的 Visual Studio 解决方案中。
  3. 为 BulletDynamics、BulletCollision 和 LinearMath 添加项目依赖项
  4. 为所有项目符号库添加参考。

现在,当我为这两种配置构建解决方案时(即为 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 项目:

http://bulletphysics.org/mediawiki-1.5.8/index.php/Creating_a_project_from_scratch#Create_a_new_Visual_Studio_project

注意:如果我使用 CMAKE 为 BulletPhysics 构建 VisualStudio 解决方案,然后将它们分别链接到我的每个 CPU 架构的 Windows 应用程序,那么它会正确构建(即为 Win32 和 x64 分开)。

有没有什么方法可以让我只使用一个 Visual Studio 解决方案?

【问题讨论】:

    标签: c++ windows visual-studio visual-c++ bulletphysics


    【解决方案1】:

    在x64 Release 中,您尝试将在调试模式下编译的静态库 (BulletCollision_vs2010_x64_debug.lib) 与在发布模式下编译的应用程序中的目标文件 (@987654325 @ 具体来说)。目标文件的编译器选项 (_ITERATOR_DEBUG_LEVEL) 和 lib 的编译器选项不匹配(分别为用于发布的值 0 和用于调试的 2)。这就是链接失败的原因。在Win32 Debug 和Win32 Release 的情况下,看起来你根本没有链接库。

    我认为项目引用出错了。

    1. 在我看来,虽然“项目引用”有利于 C# 风格的模块,但在本机开发中,它更像是不必要的复杂化。只需将普通的旧库显式添加到链接器输入,如下所示:

      ..\..\lib\BulletDynamics_vs2010_x64_debug.lib
      ..\..\lib\BulletCollision_vs2010_x64_debug.lib
      ..\..\lib\LinearMath_vs2010_x64_debug.lib
      

      为每个配置相应地更改“调试”和“x64”部分。我觉得比较靠谱。

    2. 为您的应用项目添加BulletDynamics、BulletCollision 和LinearMath 到“项目依赖项”。这将保证子弹将在您的应用程序之前构建。检查“构建顺序”标签以确保构建按正确顺序进行。
    3. 仔细检查每个模块的编译器选项是否相同。
    4. 在 Build->Configuration manager> 中,针对所有“解决方案配置”和所有“解决方案平台”(上方的下拉菜单)检查项目配置和平台是否正确。 (即,当您将解决方案切换到发布时,您没有使用调试的项目,反之亦然)
    5. 仍然失败?查看示例 Bullet 应用程序,例如“App_HelloWorld”。将它的选项与您的应用程序的选项进行比较,您肯定会找到错误的来源。
    6. 或许,您可以换一种方式:将您的应用项目添加到 Bullet 的解决方案(删除不需要的东西),看看它是否有效。

    【讨论】:

    • 似乎是不正确的项目配置。这是传递给链接器的命令行选项。
    猜你喜欢
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    相关资源
    最近更新 更多