[Python] Cython ImportError: ./region.so: undefined symbol: G_get_window

Pietro peter.zamb a gmail.com
Sab 10 Ago 2013 18:03:59 CEST


Ciao,

scusate se ritorno sull'argomento ma le mie ricerche web non mi hanno
aiutato ad identificare dove sia l'errore... Immagino che come l'altra
volta stia sbagliando qualcosa di stupido... vi riporto le parti
salienti del codice, la versione completa la potete trovare qui:

https://github.com/zarch/cygrass/tree/master/gis/region

Nel mio header ho definito la struct e le due funzioni che voglio utilizzare:

{{{
# file: "cgis.pxd"
cdef extern from "grass/gis.h":

    cdef struct Cell_head:
        int format
        int compressed
        int rows
        int rows3
        int cols
        int cols3
        int depths
        int proj
        int zone
        double ew_res
        double ew_res3
        double ns_res
        double ns_res3
        double tb_res
        double north
        double south
        double east
        double west
        double top
        double bottom


    void G_get_window(Cell_head *)
    void G_get_set_window(Cell_head *)

}}}


Poi ho definito una classe, come segue:

{{{
# file: "region.pyx"
cimport cgis


cdef class Region:

    cdef cgis.Cell_head c_region

    def __cinit__(self, default=False):
        if default:
            self.get_default()
        else:
            self.get_current()

    def get_current(self):
        cgis.G_get_set_window(&self.c_region)

    def get_default(self):
        cgis.G_get_window(&self.c_region)
}}}

E il mio file setup.py contiene:

{{{
# file: "setup.py"
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
import os

INCLUDE_DIR = os.path.join(os.getenv('GISBASE'), 'include')

setup(
    cmdclass={'build_ext': build_ext},
    ext_modules=[Extension("region", ["region.pyx"],
                           include_dirs=[INCLUDE_DIR, ],
                           ),
                 ]
)
}}}


la compilazione non dà errori ne warning... ma se provo ad importare
la classe ottengo:

{{{
In [1]: from region import Region
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-1-b863223cb34d> in <module>()
----> 1 from region import Region

ImportError: ./region.so: undefined symbol: G_get_window
}}}


qualcuno riesce a capire il perché?
Nel file gis.h è definita la struct "Cell_head" mentre le funzioni
sono a loro volta importate alla riga 577:

http://trac.osgeo.org/grass/browser/grass/trunk/include/gis.h#L577

dal seguente file:

http://trac.osgeo.org/grass/browser/grass/trunk/include/defs/gis.h#L292

Però in genere in C mi basta aggiungere l'include: #include
<grass/gis.h>, con cython devo fare qualcosa di diverso? idee?

Grazie per l'aiuto!

Pietro


Maggiori informazioni sulla lista Python