c++ - 链接 Emscripten 编译的 Box2D 时 undefined symbol

标签 c++ linker emscripten webassembly asm.js

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

我正在尝试编译一个使用 Box2D 的 C++ 程序使用 emscripten 工具将物理库传输到 webassmbly。

我可以通过尝试编译 HelloWorld 来重现我的问题Box2D 项目的示例:

mkdir -p /tmp/demo && cd /tmp/demo
git clone <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="14737d6054737d607c61763a777b79" rel="noreferrer noopener nofollow">[email protected]</a>: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。 由于环境的差异,一些框架如Box2D需要移植到Emscripten环境。

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

关于c++ - 链接 Emscripten 编译的 Box2D 时 undefined symbol ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54807601/

相关文章:

c++ - Boost d_ary_heap/priority_queue 编译错误: deleted function

c++ - 有没有办法通过 "wait"选项暂停/停止使用 mcisendstring 播放 mp3 文件?

c++ - 正则表达式重复模式和不匹配组

c - 构建 OpenWrt 包的链接器错误

c++ - 为什么 g++ 会生成多个(弱)相似符号?

javascript - Emscripten 似乎不使用 asm.js

c++ - 如何计算出使用 Qt 样式表定位哪个小部件

haskell - GHC静态链接动态库

javascript - 在不复制的情况下将数组从 C 指针发送到 JS 函数

javascript - Amped Studio 2 - 声音引擎