C++ 根据Emscripten编译的Box2D链接时未定义的符号

C++ 根据Emscripten编译的Box2D链接时未定义的符号,c++,linker,emscripten,webassembly,asm.js,C++,Linker,Emscripten,Webassembly,Asm.js,TLDR在针对Box2D编译的静态编译库版本进行链接时失败,但当包含Box2D编译的实际.o文件时,它可以工作 我试图编译一个C++程序,使用EnScript工具,使用物理库来进行WebSimBLUBY。 我可以通过尝试编译Box2D项目中的示例来重现我的问题: mkdir -p /tmp/demo && cd /tmp/demo git clone git@github.com:erincatto/Box2D.git cd Box2D # The Box2D library

TLDR在针对Box2D编译的静态编译库版本进行链接时失败,但当包含Box2D编译的实际
.o
文件时,它可以工作

我试图编译一个C++程序,使用EnScript工具,使用物理库来进行WebSimBLUBY。 我可以通过尝试编译Box2D项目中的示例来重现我的问题:

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

您可能不想从原始源代码编译Box2D。 由于环境的不同,需要为Emscripten环境移植一些框架,如Box2D

幸运的是有,包括关于如何构建它的详细说明。该端口由Emscripten的作者Alon Zakai维护