in paragraph 64.Skip this section if the XSUB functions are supposed to be called from other
modules only; read it only if you call your XSUBs from the code in your module,
or have a BOOT: section in your XS file (see perlxs/``The BOOT: Keyword'').
What is described here is equally applicable to the DynaLoader
interface.
A sufficiently complicated module using XS would have both Perl code (defined
in YourPackage.pm) and XS code (defined in YourPackage.xs). If this
Perl code makes calls into this XS code, and/or this XS code makes calls to
the Perl code, one should be careful with the order of initialization.
The call to XSLoader::load() (or bootstrap()) has three side effects:
-
if $VERSION was specified, a sanity check is done to ensure that the
versions of the .pm and the (compiled) .xs parts are compatible;
-
the XSUBs are made accessible from Perl;
-
if a BOOT: section was present in the .xs file, the code there is called.
Consequently, if the code in the .pm file makes calls to these XSUBs, it is
convenient to have XSUBs installed before the Perl code is defined; for
example, this makes prototypes for XSUBs visible to this Perl code.
Alternatively, if the BOOT: section makes calls to Perl functions (or
uses Perl variables) defined in the .pm file, they must be defined prior to
the call to XSLoader::load() (or bootstrap()).
The first situation being much more frequent, it makes sense to rewrite the
boilerplate as
package YourPackage;
use XSLoader;
use vars qw($VERSION @ISA);
BEGIN {
@ISA = qw( OnePackage OtherPackage );
$VERSION = '0.01';
# Put Perl code used in the BOOT: section here
XSLoader::load 'YourPackage', $VERSION;
}
# Put Perl code making calls into XSUBs here
If the interdependence of your BOOT: section and Perl code is
more complicated than this (e.g., the BOOT: section makes calls to Perl
functions which make calls to XSUBs with prototypes), get rid of the BOOT:
section altogether. Replace it with a function onBOOT(), and call it like
this:
package YourPackage;
use XSLoader;
use vars qw($VERSION @ISA);
BEGIN {
@ISA = qw( OnePackage OtherPackage );
$VERSION = '0.01';
XSLoader::load 'YourPackage', $VERSION;
}
# Put Perl code used in onBOOT() function here; calls to XSUBs are
# prototype-checked.
onBOOT;
# Put Perl initialization code assuming that XS is initialized here
- Can't find '%s' symbol in %s
-
(F) The bootstrap symbol could not be found in the extension module.
- Can't load '%s' for module %s: %s
-
(F) The loading or initialisation of the extension module failed.
The detailed error follows.
- Undefined symbols present after loading %s: %s
-
(W) As the message says, some symbols stay undefined although the
extension module was correctly loaded and initialised. The list of undefined
symbols follows.
- XSLoader::load('Your::Module', $Your::Module::VERSION)
-
(F) You tried to invoke load() without any argument. You must supply
a module name, and optionally its version.
To reduce the overhead as much as possible, only one possible location
is checked to find the extension DLL (this location is where make install
would put the DLL). If not found, the search for the DLL is transparently
delegated to DynaLoader, which looks for the DLL along the @INC list.
In particular, this is applicable to the structure of @INC used for testing
not-yet-installed extensions. This means that running uninstalled extensions
may have much more overhead than running the same extensions after
make install.
Please report any bugs or feature requests via the perlbug(1) utility.
perldoc2tree.cgi: /usr/lib/perl5/5.8.8/i386-linux-thread-multi/XSLoader.pm: cannot resolve L in paragraph 106.DynaLoader
Ilya Zakharevich originally extracted XSLoader from DynaLoader.
CPAN version is currently maintained by Sébastien Aperghis-Tramoni
<sebastien@aperghis.net>
Previous maintainer was Michael G Schwern <schwern@pobox.com>
This program is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
© Copyright 1997 - 2011 Virtual Solutions. All Rights Reserved.