Perl + XS 用c/c++方便的编写perl扩展
整理一下网上的资料 1. h2xs -A wldemo? 生成模板 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 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;
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 ? 进阶 ?生成的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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |