pythoncython

Compiling cython with gcc: No such file or directory from #include "ios"


Given a file docprep.pyx as simple as

from spacy.structs cimport TokenC

print("loading")

And trying to cythonize it via

cythonize -3 -i docprep.pyx

I get the following error message

docprep.c:613:10: fatal error: ios: No such file or directory
 #include "ios"
          ^~~~~
compilation terminated

As you can tell from the paths, this system has an Anaconda installation with Python 3.7. numpy, spacy and cython are all installed through conda.


Solution

  • <ios> is a c++-header. The error message shows that you try to compile a C++-code as C-code.

    Per default, Cython will produce a file with extension *.c, which will be interpreted as C-code by the compiler later on.

    Cython can also produce a file with the right file-extension for c++, i.e. *.cpp. And there are multiple ways to trigger this behavior:

    Actually, for cythonize there is no command line option to trigger c++-generation, thus the first options looks like the best way to go:

    # distutils: language = c++
    
    from spacy.structs cimport TokenC
    print("loading") 
    

    The problem is that spacy/structs.pxd uses c++-constructs, for example vectors or anything else cimported from libcpp:

    ...
    from libcpp.vector cimport vector
    ...
    

    and thus also c++-libraries/headers are needed for the build.