Cython编译模块时无法找到外部C文件标准库问题求助
解决Cython编译时无法找到C++标准头文件的问题
这个问题的核心原因很明确:你在C文件里引用了C++标准头文件(比如<cmath>),但Cython默认使用C编译器(如gcc)来编译源文件,而C编译器并不识别这些C专属的头文件——这就是为什么直接用g++(C编译器)编译cfile.c没问题,但通过Cython构建就报错。
下面是具体的解决步骤:
1. 修改setup.py配置,指定使用C++编译器
你需要在Extension对象中添加language='c++'参数,告诉distutils用C++编译器来处理所有源文件;同时别忘了把cfile.c加入到sources列表里,否则编译过程不会处理这个文件。修改后的setup.py如下:
from distutils.core import Extension, setup from Cython.Build import cythonize # 把cfile.c加入sources列表 sources = ['test.pyx', 'cfile.c'] # 添加language='c++'指定C++编译 extension = [Extension('test', sources, language='c++')] setup(ext_modules=cythonize(extension, force=True))
2. 可选:规范源文件后缀(推荐)
虽然用C编译器可以编译.c后缀的文件,但从代码规范角度来说,包含C代码的文件最好改成.cpp后缀,同时同步修改test_pxd.pxd中的引用路径:
cdef extern from "cfile.cpp": pass
然后更新setup.py里的sources为['test.pyx', 'cfile.cpp']即可。
验证修复
重新执行编译命令:
python3 setup.py build_ext --inplace
这时候Cython会调用g++来编译所有源文件,自然就能找到<cmath>这类C++标准头文件了。
内容的提问来源于stack exchange,提问作者Jonathan Lindgren
相关产品推荐
相关产品推荐

