xsloader.html
来自「perl教程」· HTML 代码 · 共 305 行 · 第 1/2 页
HTML
305 行
<?xml version="1.0" ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<!-- saved from url=(0017)http://localhost/ -->
<script language="JavaScript" src="../displayToc.js"></script>
<script language="JavaScript" src="../tocParas.js"></script>
<script language="JavaScript" src="../tocTab.js"></script>
<link rel="stylesheet" type="text/css" href="../scineplex.css">
<title>XSLoader - Dynamically load C libraries into Perl code</title>
<link rel="stylesheet" href="../Active.css" type="text/css" />
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link rev="made" href="mailto:" />
</head>
<body>
<script>writelinks('__top__',1);</script>
<h1><a>XSLoader - Dynamically load C libraries into Perl code</a></h1>
<p><a name="__index__"></a></p>
<!-- INDEX BEGIN -->
<ul>
<li><a href="#name">NAME</a></li>
<li><a href="#version">VERSION</a></li>
<li><a href="#synopsis">SYNOPSIS</a></li>
<li><a href="#description">DESCRIPTION</a></li>
<ul>
<li><a href="#migration_from_dynaloader">Migration from <code>DynaLoader</code></a></li>
<li><a href="#backward_compatible_boilerplate">Backward compatible boilerplate</a></li>
</ul>
<li><a href="#order_of_initialization__early_load__">Order of initialization: early <code>load()</code></a></li>
<ul>
<li><a href="#the_most_hairy_case">The most hairy case</a></li>
</ul>
<li><a href="#diagnostics">DIAGNOSTICS</a></li>
<li><a href="#limitations">LIMITATIONS</a></li>
<li><a href="#bugs">BUGS</a></li>
<li><a href="#see_also">SEE ALSO</a></li>
<li><a href="#authors">AUTHORS</a></li>
<li><a href="#copyright">COPYRIGHT</a></li>
</ul>
<!-- INDEX END -->
<hr />
<p>
</p>
<h1><a name="name">NAME</a></h1>
<p>XSLoader - Dynamically load C libraries into Perl code</p>
<p>
</p>
<hr />
<h1><a name="version">VERSION</a></h1>
<p>Version 0.06</p>
<p>
</p>
<hr />
<h1><a name="synopsis">SYNOPSIS</a></h1>
<pre>
<span class="keyword">package</span> <span class="variable">YourPackage</span><span class="operator">;</span>
<span class="keyword">use</span> <span class="variable">XSLoader</span><span class="operator">;</span>
</pre>
<pre>
<span class="variable">XSLoader::load</span> <span class="string">'YourPackage'</span><span class="operator">,</span> <span class="variable">$YourPackage::VERSION</span><span class="operator">;</span>
</pre>
<p>
</p>
<hr />
<h1><a name="description">DESCRIPTION</a></h1>
<p>This module defines a standard <em>simplified</em> interface to the dynamic
linking mechanisms available on many platforms. Its primary purpose is
to implement cheap automatic dynamic loading of Perl modules.</p>
<p>For a more complicated interface, see <a href="../lib/DynaLoader.html">the DynaLoader manpage</a>. Many (most)
features of <code>DynaLoader</code> are not implemented in <code>XSLoader</code>, like for
example the <code>dl_load_flags</code>, not honored by <code>XSLoader</code>.</p>
<p>
</p>
<h2><a name="migration_from_dynaloader">Migration from <code>DynaLoader</code></a></h2>
<p>A typical module using <a href="../lib/DynaLoader.html">DynaLoader</a> starts like this:</p>
<pre>
<span class="keyword">package</span> <span class="variable">YourPackage</span><span class="operator">;</span>
<span class="keyword">require</span> <span class="variable">DynaLoader</span><span class="operator">;</span>
</pre>
<pre>
<span class="keyword">our</span> <span class="variable">@ISA</span> <span class="operator">=</span> <span class="string">qw( OnePackage OtherPackage DynaLoader )</span><span class="operator">;</span>
<span class="keyword">our</span> <span class="variable">$VERSION</span> <span class="operator">=</span> <span class="string">'0.01'</span><span class="operator">;</span>
<span class="variable">bootstrap</span> <span class="variable">YourPackage</span> <span class="variable">$VERSION</span><span class="operator">;</span>
</pre>
<p>Change this to</p>
<pre>
<span class="keyword">package</span> <span class="variable">YourPackage</span><span class="operator">;</span>
<span class="keyword">use</span> <span class="variable">XSLoader</span><span class="operator">;</span>
</pre>
<pre>
<span class="keyword">our</span> <span class="variable">@ISA</span> <span class="operator">=</span> <span class="string">qw( OnePackage OtherPackage )</span><span class="operator">;</span>
<span class="keyword">our</span> <span class="variable">$VERSION</span> <span class="operator">=</span> <span class="string">'0.01'</span><span class="operator">;</span>
<span class="variable">XSLoader::load</span> <span class="string">'YourPackage'</span><span class="operator">,</span> <span class="variable">$VERSION</span><span class="operator">;</span>
</pre>
<p>In other words: replace <code>require DynaLoader</code> by <code>use XSLoader</code>, remove
<code>DynaLoader</code> from <code>@ISA</code>, change <code>bootstrap</code> by <code>XSLoader::load</code>. Do not
forget to quote the name of your package on the <code>XSLoader::load</code> line,
and add comma (<code>,</code>) before the arguments (<code>$VERSION</code> above).</p>
<p>Of course, if <code>@ISA</code> contained only <code>DynaLoader</code>, there is no need to have
the <code>@ISA</code> assignment at all; moreover, if instead of <a href="../lib/Pod/perlfunc.html#item_our"><code>our</code></a> one uses the
more backward-compatible</p>
<pre>
<span class="keyword">use</span> <span class="variable">vars</span> <span class="string">qw($VERSION @ISA)</span><span class="operator">;</span>
</pre>
<p>one can remove this reference to <code>@ISA</code> together with the <code>@ISA</code> assignment.</p>
<p>If no <code>$VERSION</code> was specified on the <code>bootstrap</code> line, the last line becomes</p>
<pre>
<span class="variable">XSLoader::load</span> <span class="string">'YourPackage'</span><span class="operator">;</span>
</pre>
<p>
</p>
<h2><a name="backward_compatible_boilerplate">Backward compatible boilerplate</a></h2>
<p>If you want to have your cake and eat it too, you need a more complicated
boilerplate.</p>
<pre>
<span class="keyword">package</span> <span class="variable">YourPackage</span><span class="operator">;</span>
<span class="keyword">use</span> <span class="variable">vars</span> <span class="string">qw($VERSION @ISA)</span><span class="operator">;</span>
</pre>
<pre>
<span class="variable">@ISA</span> <span class="operator">=</span> <span class="string">qw( OnePackage OtherPackage )</span><span class="operator">;</span>
<span class="variable">$VERSION</span> <span class="operator">=</span> <span class="string">'0.01'</span><span class="operator">;</span>
<span class="keyword">eval</span> <span class="operator">{</span>
<span class="keyword">require</span> <span class="variable">XSLoader</span><span class="operator">;</span>
<span class="variable">XSLoader::load</span><span class="operator">(</span><span class="string">'YourPackage'</span><span class="operator">,</span> <span class="variable">$VERSION</span><span class="operator">);</span>
<span class="number">1</span><span class="operator">;</span>
<span class="operator">}</span> <span class="keyword">or</span> <span class="keyword">do</span> <span class="operator">{</span>
<span class="keyword">require</span> <span class="variable">DynaLoader</span><span class="operator">;</span>
<span class="keyword">push</span> <span class="variable">@ISA</span><span class="operator">,</span> <span class="string">'DynaLoader'</span><span class="operator">;</span>
<span class="variable">bootstrap</span> <span class="variable">YourPackage</span> <span class="variable">$VERSION</span><span class="operator">;</span>
<span class="operator">};</span>
</pre>
<p>The parentheses about <a href="#item_load"><code>XSLoader::load()</code></a> arguments are needed since we replaced
<code>use XSLoader</code> by <a href="../lib/Pod/perlfunc.html#item_require"><code>require</code></a>, so the compiler does not know that a function
<a href="#item_load"><code>XSLoader::load()</code></a> is present.</p>
<p>This boilerplate uses the low-overhead <code>XSLoader</code> if present; if used with
an antic Perl which has no <code>XSLoader</code>, it falls back to using <code>DynaLoader</code>.</p>
<p>
</p>
<hr />
<h1><a name="order_of_initialization__early_load__">Order of initialization: early <a href="#item_load"><code>load()</code></a></a></h1>
<p><em>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 <code>BOOT:</code> section in your XS file (see <a href="../lib/Pod/perlxs.html#the_boot__keyword">The BOOT: Keyword in the perlxs manpage</a>).
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?