TLDR当链接到Box2D编译的静态编译库版本失败时,但是当包含Box2D编译的实际.o
文件时,它将起作用。
我正在尝试使用Emscripten工具来编译一个使用Box2D物理库的c ++程序。
我可以通过尝试从Box2D项目中编译HelloWorld示例来重现我的问题:
mkdir -p /tmp/demo && cd /tmp/demo
git clone git@github.com:erincatto/Box2D.git
cd Box2D
# The Box2D library its self uses [premake5][3] to generate makefiles.
premake5 gmake
cd Build
# Use Emscripten's emake command
emmake make Box2D
> ...
> Creating bin/x86_64/Debug
> Linking Box2D
ls bin/x86_64/Debug
> libBox2D.a
# Now try and build HelloWorld.cpp using emcc
cd ../HelloWorld
emcc -I ../ -l libBox2D HelloWorld.cpp -L ../Build/bin/x86_64/Debug -std=c++17 -o HelloWorld.js
> error: undefined symbol: _ZN14b2PolygonShape8SetAsBoxEff
但是,如果我不包含.a
文件并链接到libBox2D,而是包含Box2D编译的*.o
文件,则可以正常编译。
emcc -I ../ -std=c++17 HelloWorld.cpp ../Build/obj/x86_64/Debug/Box2D/*.o -o HelloWorld.js
node HelloWorld.js
> 0.00 4.00 0.00
> 0.00 3.99 0.00
> 0.00 3.98 0.00
> ...
奇怪的是,当我运行nm
时,我看到该符号位于.a
文件中。
nm ../Build/bin/x86_64/Debug/libBox2D.a | grep _ZN14b2PolygonShape8SetAsBoxEff`
> -------- T _ZN14b2PolygonShape8SetAsBoxEff
答案 0 :(得分:2)
您可能不想从原始来源编译Box2D。 由于环境的差异,需要为Emscripten环境移植一些诸如Box2D之类的框架。
幸运的是,这里有an Emscripten port of Box2D,其中包括有关如何构建它的详细说明。此端口由Emscripten的作者Alon Zakai维护。