Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to compile .c code from Cython with gcc

Tags:

Now that I've successfully installed Cython on Windows 7, I try to compile some Cython code using Cython, but gcc makes my life hard.

cdef void say_hello(name):     print "Hello %s" % name 

Using gcc to compile the code throws dozens of undefined reference to -erros, and I'm pretty sure the libpython.a is available (as the installation tutorial said, undefined reference to -errors are thrown if this file is missing).

$ cython ctest.pyx $ gcc ctest.c -I"C:\Python27\include" 

C:\Users\niklas\AppData\Local\Temp\cckThGrF.o:ctest.c:(.text+0x1038): undefined reference to `_imp__PyString_FromStringAndSize' C:\Users\niklas\AppData\Local\Temp\cckThGrF.o:ctest.c:(.text+0x1075): undefined reference to `_imp___Py_TrueStruct' C:\Users\niklas\AppData\Local\Temp\cckThGrF.o:ctest.c:(.text+0x1086): undefined reference to `_imp___Py_ZeroStruct' C:\Users\niklas\AppData\Local\Temp\cckThGrF.o:ctest.c:(.text+0x1099): undefined reference to `_imp___Py_NoneStruct' C:\Users\niklas\AppData\Local\Temp\cckThGrF.o:ctest.c:(.text+0x10b8): undefined reference to `_imp__PyObject_IsTrue' c:/program files/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../libmingw32.a(main.o):main.c:(.text+0xd2): undefined reference to `WinMain@16' collect2: ld returned 1 exit status 

The weird thing is, using pyximport* or a setup-script works pretty fine, but it's both not very handy when still working on a module.

How to compile those .c files generated with Cython using gcc ?

or any other compiler, important is that it will work !


*pyximport: Is it normal that only python-native functions and classes are contained in the imported module and not cdef-functions and classes ? like:

# filename: cython_test.pyx cdef c_foo():     print "c_foo !" def foo():     print "foo !"     c_foo() 

import pyximport as p; p.install() import cython_test cython_test.foo() # foo !\nc_foo ! cython_test.c_foo() # AttributeError, module object has no attribute c_foo 


UPDATE

Calling $ gcc ctest.c "C:\Python27\libs\libpython27.a" kills the undefined reference to -erros, but this one:

c:/program files/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../libmingw32.a(main.o):main.c:(.text+0xd2): undefined reference to `WinMain@16' 
like image 444
Niklas R Avatar asked Aug 08 '11 16:08

Niklas R


People also ask

Does Cython compile to C?

The Cython language is a superset of Python that compiles to C, yielding performance boosts that can range from a few percent to several orders of magnitude, depending on the task at hand. For work that is bound by Python's native object types, the speedups won't be large.

How do I compile Cython to exe?

To compile the Cython source code to a C file that can then be compiled to an executable you use a command like cython myfile. pyx --embed and then compile with whichever C compiler you are using.


2 Answers

Try:

gcc -c -IC:\Python27\include -o ctest.o ctest.c gcc -shared -LC:\Python27\libs -o ctest.pyd ctest.o -lpython27 

-shared creates a shared library. -lpython27 links with the import library C:\Python27\libs\libpython27.a.

like image 96
Eryk Sun Avatar answered Nov 06 '22 07:11

Eryk Sun


That is a linker (ld) error and not a compiler error. You should provide the path to the library (-l and -L) and not only to the headers (-I).

like image 31
Francesco Avatar answered Nov 06 '22 06:11

Francesco