From: Todd M. <jm...@st...> - 2004-07-15 14:35:46
|
On Thu, 2004-07-15 at 09:28, Mathieu Gontier wrote: > Hello, > > I am developping FEM bendings from a C++ code to Python with Numarray. > So, I have the following problem. > > In the distribution file 'libnumarray.h', the variable 'libnumarray_API' is > defined as a static variable (because of the symbol NO_IMPORT is not > defined). > > Then, I understand that all the examples are implemented in a unique file. > > But, in my project, I must edit header files and source files in order to > solve other problems (like cycle includes). So, I have two different source > files which use numarray : > - the file containing the 'init' function which call the function > 'import_libnumarray()' (which initialize 'libnumarray_API') > - a file containing implementations, more precisely an implementation calling > numarray functionnalities: with is 'static' state, this 'libnumarray_API' is > NULL... > > I tried to compile NumArray with the symbol 'NO_IMPORT' (see libnumarray.h) in > order to have an extern variable. But this symbol doesn't allow to import > numarray in the python environment. > > So, does someone have a solution allowing to use NumArray API with > header/source files ? The good news is that the 1.0 headers, at least, work. I intended to capture this form of multi-compilation-unit module in the numpy_compat example... but didn't. I think there's two "tricks" missing in the example. In *a* module of the several modules you're linking together, do the following: #define NO_IMPORT 1 /* This prevents the definition of the static version of the API var. The extern won't conflict with the real definition below. */ #include "libnumarray.h" void **libnumarray_API; /* This defines the missing API var for *all* your compilation units */ This variable will be assigned the API pointer by the import_libnumarray() call. I fixed the numpy_compat example to demonstrate this in CVS but they have a Numeric flavor. The same principles apply to libnumarray. Note that for numarray-1.0 you must include/import both the Numeric compatible and native numarray APIs separately if you use both. Regards, Todd |