[Numpy-discussion] problems with compiling and loading C++ extension

Fernando Perez fperez at colorado.edu
Wed Apr 7 21:26:10 EDT 2004


Faheem Mitha wrote:
> Dear People,
> 
> I have been having an odd problem with compiling and loading a simple
> C++ extension to python (as a .so file in Linux). Unfortunately, I'll
> need to include my files in here so I apologize in advance for the
> length of this message.

Are you sure you have all the needed 'extern C' declarations in place? 
Remember, you'll be compiling this thing with a C++ compiler, but it will be 
called by Python's C runtime.  Hence, _all_ python-visible functions will need 
to be wrapped in extern C calls, including your module initializer (you often 
don't think of this one, because it's implicitly

Here's a typical snippet for a python-visible function in one of my C++ 
blitz-based extensions:

// mts_contract
extern "C" {
     static PyObject* mts_contract(PyObject *self, PyObject *args)
     {

         PyArrayObject *M_array, *T_array;
...

and here's what the module initializer looks like:


/* Module initializer -- called on first import.
    It *must* be called initMODULENAME */
extern "C" void initutils_()
{
     import_array();

     // Initialize the dimension dispatch tables
     init_mts_contract_funcs();
     init_mtt_contract2_funcs();
     init_mseqtt_contract2_funcs();

     // Create the module and add the functions
     PyObject* mod = Py_InitModule4("utils_",
                                    compiled_methods,
                                    module_doc,
                                    (PyObject*)NULL,
                                    PYTHON_API_VERSION);

     // Add some symbolic constants to the module
     PyObject* mod_dict = PyModule_GetDict(mod);

     // Make a module-level exception
     // The first argument is what the exception class will appear to be
     // in python. The return value is a class object.
     utils_Error = PyErr_NewException("utils_.utils_Error",
                                      NULL, NULL);

     // Add it to the module's dictionary. Second argument is the key
     PyDict_SetItemString(mod_dict, "utils_Error", utils_Error);

     // Add other constants here
     PyDict_SetItemString(mod_dict, "__all__",
                          Py_BuildValue("sss",
                                        "mts_contract2",
                                        "mtt_contract2",
                                        "mseqtt_contract2"
                                        ));

     // Check for errors
     if (PyErr_Occurred())
         Py_FatalError("can't initialize module utils_");
}


I hope this helps you.  Mail me if you want the full files (this is old code I 
don't use anymore, so it may not quite compile now anymore, but you can still 
look a it).

Cheers,

f





More information about the NumPy-Discussion mailing list