How to compile .c code from Cython with gcc
Solution 1
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.
Solution 2
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).
Related videos on Youtube
Niklas R
Updated on May 18, 2020Comments
-
Niklas R almost 4 years
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 asetup
-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'
-
Francesco over 12 yearsThe "undefined reference to `WinMain@16'" means that the gcc is looking (without luck) for the "main" entry point. See for instance stackoverflow.com/questions/5259714/…
-
-
Niklas R over 12 yearsunfortunately, adding
-L"C:\Python27\libs"
does not fix this problem. -
Niklas R over 12 yearsusing
-I"C:\Python27\libs\libpython.a"
, gcc tells me that -I is not a directory. BTW: please notice the updated question. -
Francesco over 12 yearsit's a lowercase L, not an uppercase i
-
Niklas R over 12 yearsAh, sorry. Doing so (
gcc ctest.c -l "C:\Python27\libs\libpython27.a"
) causes this error, really confusing. This file exists.c:/program files/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../../mingw32/bin/ld.exe: cannot find -lC:\Python27\libs\libpython27.a
-
Niklas R over 12 yearsAwesome, the .pyd file did compile ! I can include it to python. Can't cdefs be called from python ? So I do have to write a def-wrapper for every cdef ? I'll check this out !
-
Niklas R over 12 yearsThanks for your help anyway, eryksun's version works just fine. :)
-
Francesco over 12 yearsyes the "version" is the same, -L is the path to the library dir and -l specifies the name of the library :-)
-
Niklas R over 12 yearsoh.. I understand. lol. I thougt I should add the full path to
-l
. You'll earn a +1 as well. :) -
Saullo G. P. Castro almost 11 yearsVERY IMPORTANT: if
-lpython27
is placed before thectest.c -o ctest.pyd
it just does not work... -
Eryk Sun almost 11 years@SaulloCastro: I edited the command to try to make the order more clear.
-
Saullo G. P. Castro almost 11 yearsThank you! Your answer helped a lot!