perlembed.html

来自「perl教程」· HTML 代码 · 共 795 行 · 第 1/5 页

HTML
795
字号
<pre>
    /usr/opt/perl5/CORE</pre>
<p>Execute this statement for a hint about where to find CORE:</p>
<pre>
    <span class="variable">perl</span> <span class="operator">-</span><span class="variable">MConfig</span> <span class="keyword">-e</span> <span class="string">'print $Config{archlib}'</span>
</pre>
<p>Here's how you'd compile the example in the next section,
<a href="#adding_a_perl_interpreter_to_your_c_program">Adding a Perl interpreter to your C program</a>, on my Linux box:</p>
<pre>
    % gcc -O2 -Dbool=char -DHAS_BOOL -I/usr/local/include
    -I/usr/local/lib/perl5/i586-linux/5.003/CORE
    -L/usr/local/lib/perl5/i586-linux/5.003/CORE
    -o interp interp.c -lperl -lm</pre>
<p>(That's all one line.)  On my DEC Alpha running old 5.003_05, the 
incantation is a bit different:</p>
<pre>
    % cc -O2 -Olimit 2900 -DSTANDARD_C -I/usr/local/include
    -I/usr/local/lib/perl5/alpha-dec_osf/5.00305/CORE
    -L/usr/local/lib/perl5/alpha-dec_osf/5.00305/CORE -L/usr/local/lib
    -D__LANGUAGE_C__ -D_NO_PROTO -o interp interp.c -lperl -lm</pre>
<p>How can you figure out what to add?  Assuming your Perl is post-5.001,
execute a <code>perl -V</code> command and pay special attention to the &quot;cc&quot; and
&quot;ccflags&quot; information.</p>
<p>You'll have to choose the appropriate compiler (<em>cc</em>, <em>gcc</em>, et al.) for
your machine: <code>perl -MConfig -e 'print $Config{cc}'</code> will tell you what
to use.</p>
<p>You'll also have to choose the appropriate library directory
(<em>/usr/local/lib/...</em>) for your machine.  If your compiler complains
that certain functions are undefined, or that it can't locate
<em>-lperl</em>, then you need to change the path following the <code>-L</code>.  If it
complains that it can't find <em>EXTERN.h</em> and <em>perl.h</em>, you need to
change the path following the <code>-I</code>.</p>
<p>You may have to add extra libraries as well.  Which ones?
Perhaps those printed by</p>
<pre>
   <span class="variable">perl</span> <span class="operator">-</span><span class="variable">MConfig</span> <span class="keyword">-e</span> <span class="string">'print $Config{libs}'</span>
</pre>
<p>Provided your perl binary was properly configured and installed the
<strong>ExtUtils::Embed</strong> module will determine all of this information for
you:</p>
<pre>
   % cc -o interp interp.c `perl -MExtUtils::Embed -e ccopts -e ldopts`</pre>
<p>If the <strong>ExtUtils::Embed</strong> module isn't part of your Perl distribution,
you can retrieve it from
<a href="http://www.perl.com/perl/CPAN/modules/by-module/ExtUtils/">http://www.perl.com/perl/CPAN/modules/by-module/ExtUtils/</a>
(If this documentation came from your Perl distribution, then you're
running 5.004 or better and you already have it.)</p>
<p>The <strong>ExtUtils::Embed</strong> kit on CPAN also contains all source code for
the examples in this document, tests, additional examples and other
information you may find useful.</p>
<p>
</p>
<h2><a name="adding_a_perl_interpreter_to_your_c_program">Adding a Perl interpreter to your C program</a></h2>
<p>In a sense, perl (the C program) is a good example of embedding Perl
(the language), so I'll demonstrate embedding with <em>miniperlmain.c</em>,
included in the source distribution.  Here's a bastardized, nonportable
version of <em>miniperlmain.c</em> containing the essentials of embedding:</p>
<pre>
    <span class="comment">#include &lt;EXTERN.h&gt;               /* from the Perl distribution     */</span>
    <span class="comment">#include &lt;perl.h&gt;                 /* from the Perl distribution     */</span>
</pre>
<pre>
    <span class="variable">static</span> <span class="variable">PerlInterpreter</span> <span class="variable">*my_perl</span><span class="operator">;</span>  <span class="regex">/***    The Perl interpreter    ***/</span>
</pre>
<pre>
    <span class="keyword">int</span> <span class="variable">main</span><span class="operator">(</span><span class="keyword">int</span> <span class="variable">argc</span><span class="operator">,</span> <span class="variable">char</span> <span class="operator">**</span><span class="variable">argv</span><span class="operator">,</span> <span class="variable">char</span> <span class="operator">**</span><span class="variable">env</span><span class="operator">)</span>
    <span class="operator">{</span>
        <span class="variable">PERL_SYS_INIT3</span><span class="operator">(&amp;</span><span class="variable">argc</span><span class="operator">,&amp;</span><span class="variable">argv</span><span class="operator">,&amp;</span><span class="variable">env</span><span class="operator">);</span>
        <span class="variable">my_perl</span> <span class="operator">=</span> <span class="variable">perl_alloc</span><span class="operator">();</span>
        <span class="variable">perl_construct</span><span class="operator">(</span><span class="variable">my_perl</span><span class="operator">);</span>
        <span class="variable">PL_exit_flags</span> <span class="operator">|=</span> <span class="variable">PERL_EXIT_DESTRUCT_END</span><span class="operator">;</span>
        <span class="variable">perl_parse</span><span class="operator">(</span><span class="variable">my_perl</span><span class="operator">,</span> <span class="keyword">NULL</span><span class="operator">,</span> <span class="variable">argc</span><span class="operator">,</span> <span class="variable">argv</span><span class="operator">,</span> <span class="operator">(</span><span class="variable">char</span> <span class="operator">**)</span><span class="keyword">NULL</span><span class="operator">);</span>
        <span class="variable">perl_run</span><span class="operator">(</span><span class="variable">my_perl</span><span class="operator">);</span>
        <span class="variable">perl_destruct</span><span class="operator">(</span><span class="variable">my_perl</span><span class="operator">);</span>
        <span class="variable">perl_free</span><span class="operator">(</span><span class="variable">my_perl</span><span class="operator">);</span>
        <span class="variable">PERL_SYS_TERM</span><span class="operator">();</span>
    <span class="operator">}</span>
</pre>
<p>Notice that we don't use the <code>env</code> pointer.  Normally handed to
<code>perl_parse</code> as its final argument, <code>env</code> here is replaced by
<code>NULL</code>, which means that the current environment will be used.  The macros
<code>PERL_SYS_INIT3()</code> and <code>PERL_SYS_TERM()</code> provide system-specific tune up 
of the C runtime environment necessary to run Perl interpreters; since
<code>PERL_SYS_INIT3()</code> may change <code>env</code>, it may be more appropriate to provide
<code>env</code> as an argument to perl_parse().</p>
<p>Now compile this program (I'll call it <em>interp.c</em>) into an executable:</p>
<pre>
    % cc -o interp interp.c `perl -MExtUtils::Embed -e ccopts -e ldopts`</pre>
<p>After a successful compilation, you'll be able to use <em>interp</em> just
like perl itself:</p>
<pre>
    <span class="operator">% </span><span class="variable">interp</span>
    <span class="keyword">print</span> <span class="string">"Pretty Good Perl \n"</span><span class="operator">;</span>
    <span class="keyword">print</span> <span class="string">"10890 - 9801 is "</span><span class="operator">,</span> <span class="number">10890</span> <span class="operator">-</span> <span class="number">9801</span><span class="operator">;</span>
    <span class="operator">&lt;</span><span class="variable">CTRL</span><span class="operator">-</span><span class="variable">D</span><span class="operator">&gt;</span>
    <span class="variable">Pretty</span> <span class="variable">Good</span> <span class="variable">Perl</span>
    <span class="number">10890</span> <span class="operator">-</span> <span class="number">9801</span> <span class="variable">is</span> <span class="number">1089</span>
</pre>
<p>or</p>
<pre>
    % interp -e 'printf(&quot;%x&quot;, 3735928559)'
    deadbeef</pre>
<p>You can also read and execute Perl statements from a file while in the
midst of your C program, by placing the filename in <em>argv[1]</em> before
calling <em>perl_run</em>.</p>
<p>
</p>
<h2><a name="calling_a_perl_subroutine_from_your_c_program">Calling a Perl subroutine from your C program</a></h2>
<p>To call individual Perl subroutines, you can use any of the <strong>call_*</strong>
functions documented in <a href="../../lib/Pod/perlcall.html">the perlcall manpage</a>.
In this example we'll use <code>call_argv</code>.</p>
<p>That's shown below, in a program I'll call <em>showtime.c</em>.</p>
<pre>
    <span class="comment">#include &lt;EXTERN.h&gt;</span>
    <span class="comment">#include &lt;perl.h&gt;</span>
</pre>
<pre>
    <span class="variable">static</span> <span class="variable">PerlInterpreter</span> <span class="variable">*my_perl</span><span class="operator">;</span>
</pre>
<pre>
    <span class="keyword">int</span> <span class="variable">main</span><span class="operator">(</span><span class="keyword">int</span> <span class="variable">argc</span><span class="operator">,</span> <span class="variable">char</span> <span class="operator">**</span><span class="variable">argv</span><span class="operator">,</span> <span class="variable">char</span> <span class="operator">**</span><span class="variable">env</span><span class="operator">)</span>
    <span class="operator">{</span>
        <span class="variable">char</span> <span class="variable">*args</span><span class="operator">[]</span> <span class="operator">=</span> <span class="operator">{</span> <span class="string">NULL</span> <span class="operator">}</span><span class="operator">;</span>
        <span class="variable">PERL_SYS_INIT3</span><span class="operator">(&amp;</span><span class="variable">argc</span><span class="operator">,&amp;</span><span class="variable">argv</span><span class="operator">,&amp;</span><span class="variable">env</span><span class="operator">);</span>
        <span class="variable">my_perl</span> <span class="operator">=</span> <span class="variable">perl_alloc</span><span class="operator">();</span>
        <span class="variable">perl_construct</span><span class="operator">(</span><span class="variable">my_perl</span><span class="operator">);</span>
</pre>
<pre>
        <span class="variable">perl_parse</span><span class="operator">(</span><span class="variable">my_perl</span><span class="operator">,</span> <span class="keyword">NULL</span><span class="operator">,</span> <span class="variable">argc</span><span class="operator">,</span> <span class="variable">argv</span><span class="operator">,</span> <span class="keyword">NULL</span><span class="operator">);</span>
        <span class="variable">PL_exit_flags</span> <span class="operator">|=</span> <span class="variable">PERL_EXIT_DESTRUCT_END</span><span class="operator">;</span>
</pre>
<pre>
        /*** skipping perl_run() ***/</pre>
<pre>
        <span class="variable">call_argv</span><span class="operator">(</span><span class="string">"showtime"</span><span class="operator">,</span> <span class="variable">G_DISCARD</span> <span class="operator">|</span> <span class="variable">G_NOARGS</span><span class="operator">,</span> <span class="variable">args</span><span class="operator">);</span>
</pre>
<pre>
        <span class="variable">perl_destruct</span><span class="operator">(</span><span class="variable">my_perl</span><span class="operator">);</span>
        <span class="variable">perl_free</span><span class="operator">(</span><span class="variable">my_perl</span><span class="operator">);</span>
        <span class="variable">PERL_SYS_TERM</span><span class="operator">();</span>
            <span class="operator">}</span>
</pre>
<p>where <em>showtime</em> is a Perl subroutine that takes no arguments (that's the
<em>G_NOARGS</em>) and for which I'll ignore the return value (that's the
<em>G_DISCARD</em>).  Those flags, and others, are discussed in <a href="../../lib/Pod/perlcall.html">the perlcall manpage</a>.</p>
<p>I'll define the <em>showtime</em> subroutine in a file called <em>showtime.pl</em>:</p>
<pre>
    <span class="keyword">print</span> <span class="string">"I shan't be printed."</span><span class="operator">;</span>
</pre>
<pre>
    <span class="keyword">sub</span><span class="variable"> showtime </span><span class="operator">{</span>
        <span class="keyword">print</span> <span class="keyword">time</span><span class="operator">;</span>
    <span class="operator">}</span>
</pre>
<p>Simple enough.  Now compile and run:</p>
<pre>
    % cc -o showtime showtime.c `perl -MExtUtils::Embed -e ccopts -e ldopts`</pre>
<pre>
    % showtime showtime.pl

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?