469,945 Members | 1,828 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,945 developers. It's quick & easy.

Linuz Python Module using PythonC/ API

I have this error message poping up when I try to import a module I made in C
using the Python/C API. Everything compiles like a charm.

Gives me this error message :

Traceback (most recent call last):
File "mod_test.py", line 4, in ?
import utm
ImportError: dynamic module does not define init function (initutm)

but the "initutm" function is there.

Running on Fedora Core 3.

Thanx
David

P.S Other question is there a command to know what export symbols a .so library
has ?

Relevant files below.

utmmodule.c
------------------
#include <Python.h>

#include "utm.h"
PyMODINIT_FUNC initutm(void);

static PyObject * utm_utm_to_ll(PyObject * self, PyObject * args);

static PyObject * utm_ll_to_utm(PyObject * self, PyObject * args);

static PyObject * utm_zone(PyObject * self, PyObject * args);

static PyObject * utm_grid(PyObject * self, PyObject * args);

static PyObject * utm_trans_list(PyObject * self, PyObject * args);

static PyObject * utm_transform(PyObject * self, PyObject * args);

/****************************************/

/*! \var static PyObject * UTMError

\brief UTM Python Module error handling object

*/

/****************************************/

static PyObject * UTMError;

/****************************************/

/*! \var static PyMethodDef UTMMethods

\brief UTM Python Module function list

*/

/****************************************/

static PyMethodDef UTMMethods[] = {

{"utm_to_ll", utm_utm_to_ll, METH_VARARGS, "Converts UTM coordinates to
Lat/Long using the input UTM zone number and letter and tranformation."},

{"ll_to_utm", utm_ll_to_utm, METH_VARARGS, "Converts Lat/Long coordinates to
UTM using the input transformation."},

{"zone", utm_zone, METH_VARARGS, "Returns the UTM longitude zone number."},

{"grid", utm_grid, METH_VARARGS, "Returns the UTM latitude zone letter (C to
X) - omiting chars I and O.\nReturns Z if Latitude value out of UTM bounds 84N -
80S."},

{"trans_list", utm_trans_list, METH_VARARGS, "Returns the list of available
ellipsoid transformations in a list."},

{"transform", utm_transform, METH_VARARGS, "Returns the tranform index based
on the transform type string, EX: 'WGS 84' returns index 29"},

{NULL, NULL, 0, NULL} /* Sentinel */

};

/****************************************/

/*! \fn PyMODINIT_FUNC initutm(void)

\brief Python Module __init__() function

This function is called when the module is loaded by Python. It creates a
mapping of the

python module commands linked to their C counterpart in the DLL/SO module.
It also creates

an error handling Python object (UTMError).

*/

/****************************************/

PyMODINIT_FUNC initutm(void) {

PyObject *m;

m = Py_InitModule( "utm", UTMMethods );

UTMError = PyErr_NewException( "utm.error", NULL, NULL );

Py_INCREF( UTMError );

PyModule_AddObject( m, "error", UTMError );

}
.....
------------------

makefile important lines
-------------------
CC=g++

CFLAGS=-Wall -I/usr/local/src/Python-2.3.5/Include
-L/usr/local/src/Python-2.3.5/Objects -L/usr/local/src/Python-2.3.5

LDFLAGS=

all: main

main: utm.o utmmodule.o

$(CC) $(CFLAGS) -shared -fPIC -Xlinker -export-dynamic -lpython2.3 -o utm.so

-------------------

Jul 19 '05 #1
1 1415
David a écrit :
[snip] CC=g++


So actually your 'initutm' is '_Z7initutmv' for the linker. Try building
with gcc instead, or declaring

extern "C" PyMODINIT_FUNC initutm(void);

or something like that.
Jul 19 '05 #2

This discussion thread is closed

Replies have been disabled for this discussion.

By using this site, you agree to our Privacy Policy and Terms of Use.