Mac OS下Cython编译成功但运行时报__ZNSs4_Rep20_S_empty_rep_storageE符号未找到错误
解决Cython编译后运行出现
Symbol not found: __ZNSs4_Rep20_S_empty_rep_storageE的问题 这个错误本质是你的Cython扩展在编译链接时没正确关联C标准库——__ZNSs4_Rep20_S_empty_rep_storageE是C标准库中std::string的内部符号,说明你引用的CLexActivator是C编写的模块,但编译环节没告诉编译器要链接C库。下面是具体的修复步骤:
1. 给.pyx文件添加C++语言声明
在你的.pyx文件最顶部加上一行编译指令,告诉Cython这是调用C++代码的扩展:
# distutils: language = c++ from libc.stdint cimport * cimport CLexActivator def SetProductFile(filePath): cdef bytes py_bytes = filePath.encode() cdef const char* c_string = py_bytes cdef int32_t status = CLexActivator.SetProductFile(c_string) print(status) return status
2. 修改setup.py配置,指定C++编译链接
更新你的setup.py,给Extension对象添加language='c++'参数,确保编译和链接时使用C++编译器:
from distutils.core import setup from distutils.extension import Extension from Cython.Build import cythonize # 替换成你的实际模块名和文件路径 extensions = [ Extension( "lex_activator_wrapper", sources=["lex_activator_wrapper.pyx"], language='c++', # 关键:启用C++编译链接 # 如果你有单独的CLexActivator库文件(比如libLexActivator.dylib或.a),需要添加以下参数 # libraries=["LexActivator"], # library_dirs=["../path/to/your/library"], ) ] setup( name="LexActivator Python Wrapper", ext_modules=cythonize(extensions) )
3. 重新编译扩展
删除之前的编译产物,重新执行编译命令:
rm -rf build *.so # 清理旧文件 python setup.py build_ext --inplace
额外注意事项
如果CLexActivator是用旧版libstdc++编译的(Mac OS 10.9之后默认用libc++),你可能需要在Extension中添加额外的编译链接参数:
Extension( # ... 其他参数 extra_compile_args=['-stdlib=libstdc++'], extra_link_args=['-stdlib=libstdc++'], )
不过优先建议使用系统默认的libc++,避免兼容性问题。
内容的提问来源于stack exchange,提问作者kyuusaku
相关产品推荐
相关产品推荐

