使用EMCC编译基于IfcOpenShell的C++项目时遇未定义符号问题
解决EMCC编译IfcOpenShell时OpenCascade未定义符号及typeinfo错误
针对你遇到的问题,给出以下具体解决步骤:
1. 修复内联函数未识别问题
OpenCascade的.lxx文件包含内联函数实现,EMCC的编译逻辑与Visual Studio存在差异,需确保内联定义被正确处理:
- 检查所有引用OpenCascade头文件的代码中,是否正确包含了对应的
.lxx文件(通常头文件*.hxx会通过#include "*.lxx"导入内联实现,确认该语句未被条件编译屏蔽)。 - 添加编译选项
-fno-inline(或-fno-inline-small-functions),强制编译器不忽略内联函数的定义,确保符号能被正确解析。 - 确保编译命令中通过
-I参数包含了OpenCascade的.lxx文件所在目录,避免编译器找不到内联实现文件。
2. 解决RTTI相关的typeinfo错误
你遇到的typeinfo for XXX错误是因为EMCC默认关闭了运行时类型信息(RTTI),而OpenCascade依赖RTTI实现多态逻辑:
- 在编译命令中添加
-frtti选项,启用RTTI支持。 - 若使用
-fno-rtti等禁用RTTI的选项,需移除这些设置。
3. 确保编译完整的OpenCascade依赖代码
Visual Studio能编译通过,可能是因为它自动关联了OpenCascade的预编译库或完整源码,而EMCC需要显式指定所有依赖的源码文件:
- 确认IfcOpenShell依赖的OpenCascade模块对应的
.cxx文件已全部加入编译列表,不能仅编译IfcOpenShell自身的cpp文件。 - 若使用预编译的OpenCascade库,必须确保该库是用EMCC编译生成的WebAssembly版本,Visual Studio编译的Windows库无法直接在EMCC中使用。
4. 调整EMCC链接选项
- 不要使用
ERROR_ON_UNDEFINED_SYMBOLS=0,这会掩盖真实问题,导致后续运行时崩溃。 - 若临时需要调试,可使用链接选项
-Wl,--allow-undefined允许未定义符号,但最终必须解决所有符号缺失问题才能正常运行。
内容的提问来源于stack exchange,提问作者B Programmer
相关产品推荐
相关产品推荐

