加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl + XS 用c/c++方便的编写perl扩展

发布时间:2020-12-15 23:59:41 所属栏目:大数据 来源:网络整理
导读:整理一下网上的资料 1. h2xs -A wldemo? 生成模板 Writing Wldemo/ppport.h Writing Wldemo/lib/Wldemo.pm Writing Wldemo/Wldemo.xs Writing Wldemo/Makefile.PL Writing Wldemo/README Writing Wldemo/t/Wldemo.t Writing Wldemo/Changes Writing Wldemo/M

整理一下网上的资料

1. h2xs -A wldemo? 生成模板
Writing Wldemo/ppport.h
Writing Wldemo/lib/Wldemo.pm
Writing Wldemo/Wldemo.xs
Writing Wldemo/Makefile.PL
Writing Wldemo/README
Writing Wldemo/t/Wldemo.t
Writing Wldemo/Changes
Writing Wldemo/MANIFEST

cd Wldemo

修改Wldemo.xs文件 参考文档perlxs,perlguts,ppport.h

#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "ppport.h"

#define CRCPOLY   0xEDB88320UL
#define CRCINIT   0xFFFFFFFF
unsigned long c_dCrcTable32[UCHAR_MAX + 1];

MODULE = Wldemo		PACKAGE = Wldemo		

void 
crc32_init(char *classname)
CODE:
    unsigned int i,j;
	unsigned long r;
	
	for (i = 0; i <= UCHAR_MAX; i++)
	{
	    r = i;
		for (j = 0; j < CHAR_BIT; j++)
		{
		    if (r & 1)
			{
			    r = (r >> 1) ^ CRCPOLY;
			}
			else
			{
			    r >>= 1;
			}
		}
		c_dCrcTable32[i] = r;
	}


unsigned long 
crc32(char *classname,int n,char* c)
CODE:
	unsigned long r;
	unsigned char* p = (unsigned char*)c;
	
	r = CRCINIT;
	while (--n >= 0)
	{
	    r = (r >> CHAR_BIT) ^ c_dCrcTable32[(unsigned char)r ^ (*p)];
	    p++;
	}
	
	r = ~r;
    RETVAL = r;
OUTPUT:
    RETVAL

2. perl Makefile.PL? 生成Makefile文件

3. dmake

4. dmake test

5. dmake install

t/Wldemo.t .. ok
All tests successful.
Files=1,Tests=1,? 1 wallclock secs ( 0.22 usr +? 0.08 sys =? 0.30 CPU)
Result: PASS

6. 可以修改Wldemo.pm 重载函数

package Wldemo;

use 5.018002;
use strict;
use warnings;

require Exporter;

our @ISA = qw(Exporter);

# Items to export into callers namespace by default. Note: do not export
# names by default without a very good reason. Use EXPORT_OK instead.
# Do not simply export all your public functions/methods/constants.

# This allows declaration	use Wldemo ':all';
# If you do not need this,moving things directly into @EXPORT or @EXPORT_OK
# will save memory.
our %EXPORT_TAGS = ( 'all' => [ qw(
	
) ] );

our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );

our @EXPORT = qw(
    crc32_init
    mycrc32
);

our $VERSION = '0.01';

require XSLoader;
XSLoader::load('Wldemo',$VERSION);

# Preloaded methods go here.
sub mycrc32{
    my ($class,$num,$char)=@_;
    print "$num good luckn";
    crc32($class,$char);

}
1;


7. perl 进行调用测试

use Wldemo qw(crc32_init mycrc32); 

my @data1 = (0x00,0x00,0x00);
my @data2 = (0xFF,0xFF,0xFF);
my @data3 = (0x01,0x02,0x03,0x04);
my @data4 = (0x04,0x01);
my @data5 = (0x00,0x00);
my @data6 = (0xFF,0xFF);
my @data7 = (0x00,0x00);
my $d8 = "";

Wldemo->crc32_init();
 
printf("%xn",Wldemo->mycrc32(4,$d8));
printf("%xn",pack("C4",@data1)));
printf("%xn",Wldemo->crc32(4,@data2)));
printf("%xn",@data3)));
printf("%xn",@data4)));
printf("%xn",Wldemo->crc32(3,pack("C3",@data5)));
printf("%xn",Wldemo->crc32(5,pack("C5",@data6)));

<>;

4 good luck
2144df1c
4 good luck
2144df1c
ffffffff
b63cfbcd
e951a406
ff41d912
d2fd1072

?

进阶

?生成的Wldemo.c的编译过程:

@echo off

gcc -c  -I. -s -O2 -DWIN32 -DPERL_TEXTMODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -fno-strict-aliasing -mms-bitfields -s -O2   -DVERSION="0.01"    -DXS_VERSION="0.01" "-IC:strawberryperllibCORE" Wldemo.c
dlltool --def Wldemo.def --output-exp dll.exp
g++ -o blibarchautoWldemoWldemo.dll -Wl,--base-file -Wl,dll.base -mdll -s -L"C:strawberryperllibCORE" -L"C:strawberryclib" Wldemo.o   C:strawberryperllibCORElibperl518.a -lmoldname -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -lnetapi32 -luuid -lws2_32 -lmpr -lwinmm -lversion -lodbc32 -lodbccp32 -lcomctl32 dll.exp
dlltool --def Wldemo.def --base-file dll.base --output-exp dll.exp
g++ -o blibarchautoWldemoWldemo.dll -mdll -s -L"C:strawberryperllibCORE" -L"C:strawberryclib" Wldemo.o   C:strawberryperllibCORElibperl518.a -lmoldname -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -lnetapi32 -luuid -lws2_32 -lmpr -lwinmm -lversion -lodbc32 -lodbccp32 -lcomctl32 dll.exp

pause

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读