使用Cython链接Boost(C++)时遇ImportError问题求助
解决Boost序列化相关的未定义符号导入错误
问题重现
运行Python测试时触发ImportError,提示Boost archive的基础类符号未定义:
tests/pipeline/feature_extraction/test_rolling_windows.py:5: in <module> from pipeline.feature_extraction.rolling_window.windows import ( E ImportError: /home/ec2-user/SageMaker/data-science/pipeline/feature_extraction/rolling_window/windows.cpython-38-x86_64-linux-gnu.so: undefined symbol: _ZTIN5boost7archive6detail14basic_oarchiveE
问题根源
你的setup.py存在两处关键配置错误:
- Boost链接库参数(
-lboost_serialization、-lboost_filesystem等)被错误放在extra_compile_args中,这类参数属于链接阶段依赖,编译阶段不需要,必须移至extra_link_args。 include_dirs混入了库目录(/usr/local/lib),library_dirs混入了头文件目录(/usr/local/include、/usr/local/include/boost),目录类型配置混乱。
修正后的setup.py配置
from setuptools import setup, Extension from Cython.Build import cythonize import numpy as np setup( version="1.0.0", ext_modules=cythonize( Extension( "windows", sources=["rolling_window.pyx"], # 仅保留头文件目录 include_dirs=[np.get_include(), "/usr/local/include"], language="c++", # 编译参数仅保留编译相关选项 extra_compile_args=["-std=c++11", '-Wno-unused-local-typedef'], # 链接参数包含标准及Boost依赖库 extra_link_args=[ "-std=c++11", "-lboost_serialization", "-lboost_filesystem", "-lboost_system" # 注意:boost_archive属于boost_serialization子模块,无需单独链接 ], # 仅保留库文件目录 library_dirs = ["/usr/local/lib"] ), compiler_directives={"language_level": "3"}, ) )
后续验证步骤
- 清理旧编译产物:删除生成的
.so文件和build目录 - 重新编译安装:执行
pip install -e .或python setup.py build_ext --inplace - 重新运行测试脚本
内容的提问来源于stack exchange,提问作者Saif Ali Khan
相关产品推荐
相关产品推荐

