使用 gcc 编译 cython:#include "ios" 中没有这样的文件或目录
Posted
技术标签:
【中文标题】使用 gcc 编译 cython:#include "ios" 中没有这样的文件或目录【英文标题】:Compiling cython with gcc: No such file or directory from #include "ios" 【发布时间】:2018-11-25 20:32:57 【问题描述】:给定一个文件docprep.pyx
这么简单
from spacy.structs cimport TokenC
print("loading")
并试图通过 cythonize 它
cythonize -3 -i docprep.pyx
我收到以下错误消息
docprep.c:613:10: fatal error: ios: No such file or directory
#include "ios"
^~~~~
compilation terminated
从路径可以看出,该系统安装了 Python 3.7 的 Anaconda。 numpy
、spacy
和cython
都是通过conda
安装的。
【问题讨论】:
ios
是一个 c++ 头文件(我不知道它来自哪里,但他们应该称它为 #include <ios>
),所以你可能需要将它构建为 c++,即 @ 987654332@
Using C++ STL maps in Cython的可能重复
@ead 谢谢,这就是问题所在。然后我需要修复 4 个额外的问题:1)编译 .cpp
文件,而不是 .c
文件 2)使用 cython 和 --embed
3)将 main
函数添加到 python 程序 4)使用 -lpython3.7m
而不是-lpython3.7
。谢谢!
@DavidW 这不是重复的。这个问题是关于独立编译的。没有setup.py
或Python 文件调用pyx
。
在我的情况下--cplus
不起作用,我需要在 setup.py 文件中添加language="c++"
。
【参考方案1】:
在我的例子中,它使用@mountrix 提示,只需将language="c++"
添加到您的 setup.py 中,例如:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
import numpy
extensions = [
Extension("processing_module", sources=["processing_module.pyx"], include_dirs=[numpy.get_include()], extra_compile_args=["-O3"], language="c++")
]
setup(
name="processing_module",
ext_modules = cythonize(extensions),
)
【讨论】:
您也可以在.pyx
文件开头添加以下行:# distutils: language = c++
【参考方案2】:
<ios>
是一个 c++ 头文件。错误消息显示您尝试将 C++ 代码编译为 C 代码。
默认情况下,Cython 将生成一个扩展名为 *.c
的文件,稍后编译器会将其解释为 C 代码。
Cython 还可以为 c++ 生成具有正确文件扩展名的文件,即*.cpp
。并且有多种方法可以触发此行为:
pyx
-文件的开头添加# distutils: language = c++
。
将language="c++"
添加到setup.py
文件中的Extension
定义中。
使用选项--cplus
致电cython
。
在 IPython 中,使用 -+
调用 %%cython
magic,即 %%cython -+
。
有关使用pyximport
构建时的替代方案,请参阅this SO-question。
实际上,cythonize
没有命令行选项来触发 c++ 生成,因此第一个选项看起来是最好的选择:
# distutils: language = c++
from spacy.structs cimport TokenC
print("loading")
问题在于 spacy/structs.pxd
使用 c++-constructs、for example vectors 或从 libcpp
导入的任何其他 c:
...
from libcpp.vector cimport vector
...
因此构建也需要 c++ 库/头文件。
【讨论】:
我认为distutils: language
选项通常是要走的路 - 语言的选择确实需要 pyx 文件,因此必须将选择器放在其他任何地方只会使跟踪正在发生的事情变得更加困难. (不过,列出所有选项肯定很有用)以上是关于使用 gcc 编译 cython:#include "ios" 中没有这样的文件或目录的主要内容,如果未能解决你的问题,请参考以下文章