关于DynaLoader 的问题

关于DynaLoader 的问题

关于DynaLoader 的问题
菜鸟一问^^;
一个简单的程序:
package Test;
require DynaLoader;
@ISA = qw(DynaLoader);

bootstrap Test;
...
(http://www.xav.com/perl/lib/DynaLoader.html)
可是却得到如下错误
Can't locate loadable object for module Parser in @INC (@INC contains: /usr/lib/perl5/5.8/cygwin /usr/lib/perl5/5.8 /usr/lib/perl5/site_perl/5.8/cygwin /usr/lib/perl5/site_perl/5.8 /usr/lib/perl5/vendor_perl/5.8/cygwin /usr/lib/perl5/vendor_perl/5.8 .) at xxx line 4
DynaLoader.pm确实在@INC包含的路径内。
我查看了DynaLoader.pm中bootstrap的说明,发现了这么一行注释:
#[color=red] The bootstrap function cannot be autoloaded (without complications)[/color]
# so we define it here:
sub bootstrap {
...
是因为这个么?有没有人帮忙给我解释一下,而且我总是遇到Can't locate loadable object for module..的错误,查了很多文档也没头绪[CCB]10[/CCB]
多谢了!
你这是想要干什么?[CCB]1.
你这是想要干什么?[CCB]10[/CCB]
先说说你的目的好吗?
如果你是在学习如何使用 DynaLoader 模块的话,
那么我告诉你,这个模块基本上是不用你来手工调用的。
写 XS 的时候,h2xs 会自动生成这些代码的。
SWIG 也应该可以生成相关的代码(虽然我没用过)。

如果你一定要手工书写这些代码,
那么,你就得明白 DynaLoader.pm 都做了些什么,以及需要为它准备些什么。
所以你还是把那篇文档看完吧。

BTW:你在这里撒了个小小的谎来骗大家--你提供的代码里包名明明是 Test,可是错误信息中是“Parse”,记住下次不要这样。否则大家很难有效地帮你,反而会被你误导到另一个方向。

提示:DynaLoader.pm 是用来动态加载模块的,你需要动态加载的模块在哪儿?你得先准备一下。
还是有问题....
还是有问题....
运行:
h2xs -A -n Test
生成一下文件
Writing Test/ppport.h
Writing Test/lib/Test.pm
Writing Test/Test.xs
Writing Test/Makefile.PL
Writing Test/README
Writing Test/t/Test.t
Writing Test/Changes
Writing Test/MANIFEST

在Test.xs中添加代码:
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
MODULE = Test PACKAGE = Test
[color=red]void
hello()
CODE:
printf("Hello, world!\n");[/color]
运行perl Makefile.pl 和 make,成功
新建一个脚本文件,test.pl
#! /usr/local/bin/perl
BEGIN { unshift(@INC, "./blib") }
use Test;
Test::hello();
运行perl test.pl报错:
[color=red]Can't locate Test.pm[/color] in @INC (@INC contains: ./blib /usr/lib/perl5/5.8/cygwin /usr/lib/perl5/5.8 /usr/lib/perl5/site_perl/5.8/cygwin /usr/lib/perl5/site_perl/5.8 /usr/lib/perl5/site_perl/5.8/cygwin /usr/lib/perl5/site_perl/5.8 /usr/lib/perl5/vendor_perl/5.8/cygwin /usr/lib/perl5/vendor_perl/5.8 /usr/lib/perl5/vendor_perl/5.8/cygwin /usr/lib/perl5/vendor_perl/5.8 .) at test.pl line 4.
BEGIN failed--compilation aborted at test.pl line 4.
若将BEGIN { unshift(@INC, "./blib") }改为BEGIN { unshift(@INC, "./blib/lib") }则错误变为
[color=red]Can't locate loadable object for module Test[/color] in @INC (@INC contains: ./blib/lib /usr/lib/perl5/5.8/cygwin /usr/lib/perl5/5.8 /usr/lib/perl5/site_perl/5.8/cygwi
n /usr/lib/perl5/site_perl/5.8 /usr/lib/perl5/site_perl/5.8/cygwin /usr/lib/perl5/site_perl/5.8 /usr/lib/perl5/vendor_perl/5.8/cygwin /usr/lib/perl5/vendor_perl/5.8 /usr/lib/perl5/vendor_perl/5.8/cygwin /usr/lib/perl5/vendor_perl/5.8 .) at test.pl line 4

[color=red]ps:Test.pm[/color]
package Test2;

use 5.008007;
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 stead.
# Do not simply export all your public functions/methods/constants.

# This allows declaration use Test2 ':all';
# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
# will save memory.
our %EXPORT_TAGS = ( 'all' =>
make install.
[CCB]1[/CCB] 原来如此,这么简单.....
[quote]回复给 anthony : .
[quote]回复给 anthony : make install....[/quote]
开发或者安装一个模块的顺序是先 test,再 install,而不是先 install,再 test。
[quote]回复给 flw : [quo.
[quote]回复给 flw : [quote]回复给 ming_322 :....[/quote]
testlib 是什么?怎么弄?
ppm--install ExtUtils:.
ppm
install ExtUtils::testlib

unix用cpan
[quote]回复给 jackycheng.
[quote]回复给 jackycheng : ppm--install ExtUtils:....[/quote]
大哥, ExtUtils::testlib 是标准模块,不需要自己安装的。
另外那位兄弟似乎没有仔细看我的回复,我都说了把啥啥啥改成啥啥啥了,你居然还问“怎么弄”,噎得我再无话可说。
厄,我也都被他骗啦。--.
厄,我也都被他骗啦。
就当他想用最新版本重新升级吧,哈哈