SWIG跨模块Python绑定:导入时未定义符号_ZTI4Base问题求助
解决SWIG派生模块导入时的undefined symbol错误
你遇到的ImportError: undefined symbol: _ZTI4Base错误,本质是派生模块_derived_module.so加载时找不到基类Base的RTTI类型信息符号——因为Base类包含虚函数,编译器会生成RTTI相关符号,而当前派生模块的动态库未链接包含这些符号的目标文件或库。
以下是两种可行的解决方法:
方案一:修改Makefile,链接基类依赖
在生成_derived_module.so时,将基类的目标文件或已编译的模块链接进去,让派生模块直接包含所需符号。修改Makefile中的链接命令:
原命令:
${LD} -shared derived_module_wrap.o -o _derived_module.so
改为(链接base.o):
${LD} -shared derived_module_wrap.o base.o -o _derived_module.so
或者(链接已生成的_base_module.so):
${LD} -shared derived_module_wrap.o -L. -lbase_module -o _derived_module.so
方案二:修改测试脚本,调整模块导入顺序
在Python测试脚本中先导入基类模块,让动态加载器提前加载_base_module.so,使基类符号在进程空间中可用:
修改后的test.py:
#!/usr/bin/env python3 import sys import base_module # 先导入基类模块 import derived_module if __name__ == "__main__": derived = derived_module.derived() res = derived.foo() print("res={}".format(res)) sys.exit()
两种方案的区别:方案一让派生模块独立运行,无需依赖导入顺序;方案二更贴合SWIG多模块设计的预期,利用动态库的符号共享特性。
内容的提问来源于stack exchange,提问作者uuu777
相关产品推荐
相关产品推荐

