[Numpy-discussion] Exported symbols and code reorganization.
David Cournapeau
david at ar.media.kyoto-u.ac.jp
Tue Jan 9 02:45:31 CST 2007
Charles R Harris wrote:
>
>
> On 1/7/07, *Robert Kern* <robert.kern at gmail.com
> <mailto:robert.kern at gmail.com>> wrote:
>
> Charles R Harris wrote:
>
>
> <snip>
>
> No, but as with mtrand, most of those arise from the fact that
> these functions
> are implemented in files other than the C file that contains the
> Python module
> code. In order for them to be called from the Python module code,
> they need to
> be exported, IIRMCC (If I Remember My C Correctly). This appears
> to be true of
> essentially every other extension module in my site-packages, so I
> don't think
> it's going to be much of a problem.
>
>
> I don't think unnecessary public symbols are much of a problem,
> either, but it bears on the question of breaking up the core numpy
> files. The parts could be treated in the same way, i.e., compiled
> separately and linked, or they could be treated as you suggested
> previously, declared static and the code included into one base file.
> I suspect the inclusion route is a bit easier from a portability
> standpoint, long link lists can be a problem and the making of
> libraries is platform dependent.
>
Bit late at joining the discussion... I started the same thing,
splitting up those files.
As Travis reminded me in a previous discussion, most symbols in numpy
extensions are private (eg static functions) because that's the way
python extension works:
http://docs.python.org/ext/methodTable.html ("The method table must be
passed to the interpreter in the module's initialization function. The
initialization function must be named initname(), where name is the name
of the module, and should be the only non-static item defined in the
module file:")
By not declaring them static, you are explicitly breaking this. Now, I
don't see any other reason than avoiding polluting the global namespace
with the potential to have clashing names (I don't think numpy is likely
to be big enough so that the cost of loading the shared libraries would
be prohibitive); but my understanding is that the whole point of having
a list of pointer of functions when exporting a C Api from a python
module is precisely for this same reason, eg using static, because
that's the only portable way to avoid name clashes. The following page
explains it fairly clearly:
http://docs.python.org/ext/using-cobjects.html
There are other, more elegant solutions to avoid name clashes, but they
are platform and/or compiler dependent. I exposed the ones I found/heard
about in a previous email (gcc specific, but I know at least MS compiler
and Sun C compiler have a similar capability):
"
One elegant solution for this is non portable, unfortunately: recent
gcc version has this functionality called new C++ visibility support,
which also works for C source files.
http://gcc.gnu.org/wiki/Visibility
This file explains the different ways of limiting symbols in dso available
http://people.redhat.com/drepper/dsohowto.pdf
Having several include of C files is the easiest way, and I guess this
would be the safest way to start splitting source files. A better way
can always be used after anyway, I guess."
cheers,
David
More information about the Numpy-discussion
mailing list