背景

别问,问就是在写C++\OpenGL + Bullet 物理引擎

表现

报错如下

1
2
3
error LNK2019: 无法解析的外部符号 "void * __cdecl btAlignedAllocInternal ...

...

1

将平台从(x64)改为(Win32/x86)后,Bullet不报错了,但是OpenGL又出问题了,如下

1
2
error LNK2019: 无法解析的外部符号 _glfwInit,函数 "struct GLFWwindow * __cdecl initWindow(int,int,char const *,int,int)" (?initWindow@@YAPAUGLFWwindow@@HHPBDHH@Z) 中引用了该符号
...

2

原因

Bullet官方默认提供32位的库,如果需要其它平台的库需要自行编译

在stackoverflow找到了类似的情况——传送门直达

给出的回答是:

3

说明是平台原因,试了一下, 当我把官方示例demoapplication项目从32位改为64位编译就会报出无法找到符号异常

解决

使用官方提供的生成工具先生成一次sln项目,版本建议选vs2010(毕竟这年头谁还用vs2005

进入后将调试从x86改为x64,然后再调试一次。调试完毕后,在bullet文件夹目录下找到lib文件夹,里面会多出有x64字样的链接库文件,而不带x64字样的就是x86平台的链接库文件,所以我们只需要在自己的vs项目中的附加依赖项稍加修改即可。

如图,红色方框即是64位链接库,蓝色方框即是32位链接库。

4

现在再一次对附加依赖项进行修改。添加以下数据进去:

1
2
3
X:\xxx\xxx\Bullet\lib\BulletDynamics_vs2010_x64_debug.lib
X:\xxx\xxx\Bullet\lib\BulletCollision_vs2010_x64_debug.lib
X:\xxx\xxx\Bullet\lib\LinearMath_vs2010_x64_debug.lib

注意,X:\xxx\xxx要替换为你bullet实际的文件地址

5

再次编译运行,成功解决