emscripten编译Boost Test时wasm-ld参数错误如何解决
问题原因
Boost.Build的默认类Unix链接规则会在生成共享库的步骤传入-h(设置soname)、-Bstatic/-Bdynamic(切换静态/动态链接模式)参数,但emscripten使用的wasm-ld不支持这些传统原生链接器参数,因此触发报错。手动删除这些参数后可正常编译,也验证了该问题根因。
解决方法
快速修复(无需修改配置文件)
直接在原有b2命令中追加link=static参数,强制只构建静态库:
./b2 --address-model=32 --layout=tagged --build-type=minimal --build-dir=./build --with-test threading=multi toolset=emscripten variant=release link=static
静态库构建流程不会触发共享库专属的参数传递逻辑,执行后即可正常编译,不需要改动任何配置文件,是成本最低的方案。
如果必须构建可重定位的wasm动态目标,额外追加linkflags="-s SIDE_MODULE=1"参数即可,不要使用默认的原生共享库构建规则。
永久修复(适配所有Boost库的emscripten编译)
如果需要长期用emscripten编译Boost的多个库,直接修改Boost构建系统里的emscripten工具链配置文件,路径为tools/build/src/tools/emscripten.jam:
- 定位到
link.dll动作定义段,删除命令里的-h "$(<[1]:D=)"、-Bstatic、-Bdynamic三个不兼容参数,修改后的段如下:actions link.dll bind LIBRARIES { "$(CONFIG_COMMAND)" -L"$(LINKPATH)" -o "$(<)" $(OPTIONS) $(USER_OPTIONS) $(LIBRARIES) } - 在文件的flags配置段新增一行,屏蔽soname参数的自动传递:
toolset.flags emscripten.link DLLFLAGS : <soname> ;
修改完成后,执行原有b2命令就不会再传入不兼容参数,所有Boost库的编译都会走wasm兼容的链接流程。
内容的提问来源于stack exchange,提问作者Tibor Takács
相关产品推荐
相关产品推荐

