Cómo compilar código .c de Cython con gcc

3 minutos de lectura

avatar de usuario
niklas r

Ahora que instalé Cython con éxito en Windows 7, intento compilar algún código de Cython usando Cython, pero gcc me complica la vida.

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

El uso de gcc para compilar el código arroja docenas de referencia indefinida a -errores, y estoy bastante seguro de que el libpython.a está disponible (como decía el tutorial de instalación, referencia indefinida a -se lanzan errores si falta este archivo).

$ 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

Lo raro es que usando pyximport* o un setup-script funciona bastante bien, pero no es muy útil cuando todavía se trabaja en un módulo.

Cómo compilar esos .c archivos generados con Cython usando gcc?

o cualquier otro compilador, ¡lo importante es que funcione!

*pyximport: ¿Es normal que solo las funciones y clases nativas de Python estén contenidas en el módulo importado y no las funciones y clases de cdef? me gusta:

# 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

ACTUALIZAR

Vocación $ gcc ctest.c "C:\Python27\libs\libpython27.a" mata al referencia indefinida a -errores, pero este:

c:/program files/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../libmingw32.a(main.o):main.c:(.text+0xd2): undefined reference to `WinMain@16'

  • La “referencia indefinida a `WinMain@16′” significa que el gcc está buscando (sin suerte) el punto de entrada “principal”. Consulte, por ejemplo, stackoverflow.com/questions/5259714/…

    – Francisco

    8 de agosto de 2011 a las 19:05


avatar de usuario
Sol Eryk

Tratar:

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

-shared crea una biblioteca compartida. -lpython27 enlaces con la biblioteca de importación C:\Python27\libs\libpython27.a.

  • Impresionante, ¡el archivo .pyd se compiló! Puedo incluirlo en python. ¿No se pueden llamar cdefs desde python? Entonces, ¿tengo que escribir un def-wrapper para cada cdef? Voy a comprobar esto!

    – NiklasR

    8 de agosto de 2011 a las 19:28

  • MUY IMPORTANTE: si -lpython27 se coloca antes de la ctest.c -o ctest.pyd Simplemente no funciona…

    – Saullo GP Castro

    8 de julio de 2013 a las 6:59

  • @SaulloCastro: Edité el comando para intentar que el orden fuera más claro.

    –Eryk Sun

    8 de julio de 2013 a las 7:47

  • ¡Gracias! ¡Tu respuesta ayudó mucho!

    – Saullo GP Castro

    8 de julio de 2013 a las 8:08

Eso es un error del enlazador (ld) y no un error del compilador. Debe proporcionar la ruta a la biblioteca (-l y -L) y no solo a los encabezados (-I).

  • desafortunadamente, agregando -L"C:\Python27\libs" no soluciona este problema.

    – NiklasR

    8 de agosto de 2011 a las 17:17

  • utilizando -I"C:\Python27\libs\libpython.a"gcc me dice que -I no es un directorio. por cierto: tenga en cuenta la pregunta actualizada.

    – NiklasR

    8 de agosto de 2011 a las 19:06


  • es una L minúscula, no una i mayúscula

    – Francisco

    8 de agosto de 2011 a las 19:09

  • Oh, lo siento. Haciéndolo (gcc ctest.c -l "C:\Python27\libs\libpython27.a") provoca este error, realmente confuso. Este archivo existe. c:/program files/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../../mingw32/bin/ld.exe: cannot find -lC:\Python27\libs\libpython27.a

    – NiklasR

    8 de agosto de 2011 a las 19:19


  • Gracias por su ayuda de todos modos, la versión de eryksun funciona bien. 🙂

    – NiklasR

    8 de agosto de 2011 a las 19:31

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad