perl, написание модулей (не видно под-модулей)

Модератор: Модераторы разделов

vadiml
Сообщения: 446
ОС: fc12.x86_64

perl, написание модулей

Сообщение vadiml »

есть модуль aa.pm (package aa)
там же есть каталог aa c bb.pm (package aa::bb)

пишу в программе:
use lib qw (путь к каталогу с aa.pm и aa/bb.pm);
use aa::bb;

получаю Can't locate loadable object for module aa::bb in @INC (и здесь все пути, в том числе и путь к aa.pm)

меняю на:

Код: Выделить всё

use lib qw (путь к каталогу с aa.pm и aa/bb.pm);
use aa;

my $x = aa::bb::new; # это видит нормально
my $y = aa::bb::new1; # получаю Undefined subroutine &aa::bb::new1 called at t/4.t line 13.



при этом ранее писал модули для Tk и они прекрасно вызывались по
use Tk; # здесь модуль Tk нужет для доступа к своим функциям, напр MainLoop, ;
use Tk::модуль;

код для new и new1 абсолютно одинаков
phenom x4 905e, asus m4a79 deluxe, 4 gb, ati x550, ati 4350, 2 x 17" LCD
Спасибо сказали:
arto
Сообщения: 7

Re: perl, написание модулей

Сообщение arto »

aa::bb -- xs?
Спасибо сказали:
vadiml
Сообщения: 446
ОС: fc12.x86_64

Re: perl, написание модулей

Сообщение vadiml »

да
phenom x4 905e, asus m4a79 deluxe, 4 gb, ati x550, ati 4350, 2 x 17" LCD
Спасибо сказали:
vadiml
Сообщения: 446
ОС: fc12.x86_64

Re: perl, написание модулей

Сообщение vadiml »

код в .c файле для new и new1 одинаков.
вот bb.xs:

Код: Выделить всё

bb *
bb::new()


bb *
new1(CLASS)
    char * CLASS
    CODE:
        RETVAL = new bb();
    OUTPUT:
        RETVAL


в результате получается в bb.с:

Код: Выделить всё

XS(XS_aa__bb_new); /* prototype to pass -Wmissing-prototypes */
XS(XS_aa__bb_new)
{
    dXSARGS;
    if (items != 1)
        Perl_croak(aTHX_ "Usage: aa::bb::new(CLASS)");
    {
        char *  CLASS = (char *)SvPV_nolen(ST(0));
        bb * RETVAL;

        RETVAL = new bb();
        ST(0) = sv_newmortal();
        sv_setref_pv( ST(0), CLASS, (void*)RETVAL );

    }
    XSRETURN(1);
}

XS(XS_aa__bb_new1); /* prototype to pass -Wmissing-prototypes */
XS(XS_aa__bb_new1)
{
    dXSARGS;
    if (items != 1)
        Perl_croak(aTHX_ "Usage: aa::bb::new1(CLASS)");
    {
        char *  CLASS = (char *)SvPV_nolen(ST(0));
        bb * RETVAL;
#line 26 "bb.xs"
        RETVAL = new bb();
#line 54 "bb.c"
        ST(0) = sv_newmortal();
        sv_setref_pv( ST(0), CLASS, (void*)RETVAL );

    }
    XSRETURN(1);
}
phenom x4 905e, asus m4a79 deluxe, 4 gb, ati x550, ati 4350, 2 x 17" LCD
Спасибо сказали:
arto
Сообщения: 7

Re: perl, написание модулей

Сообщение arto »

лоадабельный объект лежит где надо?
Спасибо сказали:
vadiml
Сообщения: 446
ОС: fc12.x86_64

Re: perl, написание модулей

Сообщение vadiml »

модули лежат как:
blib/lib/aa.pm
blib/lib/aa/bb.pm

я в тестовом скрипте пишу:
use blib;
use aa::bb;


в документации написано, что use blib находит каталог blib/lib до 4 уровней вверх и по
use aa;
модуль aa.pm находит и работает, а
use aa::bb; -- нет
phenom x4 905e, asus m4a79 deluxe, 4 gb, ati x550, ati 4350, 2 x 17" LCD
Спасибо сказали:
arto
Сообщения: 7

Re: perl, написание модулей

Сообщение arto »

vadiml писал(а):
19.07.2007 15:50
модули лежат как:
blib/lib/aa.pm
blib/lib/aa/bb.pm

я в тестовом скрипте пишу:
use blib;
use aa::bb;


в документации написано, что use blib находит каталог blib/lib до 4 уровней вверх и по
use aa;
модуль aa.pm находит и работает, а
use aa::bb; -- нет


я вас спросил про loadable object.
Спасибо сказали:
vadiml
Сообщения: 446
ОС: fc12.x86_64

Re: perl, написание модулей

Сообщение vadiml »

изначально в lib/aa/
после perl Makefile.PL && make его копия появляется в blib/lib/aa/,
а общий для всех aa.so в blib/arch/auto/aa/

я так же попробовал положить в lib/aa/ еще один модуль не использующий xs, cc.pm,
он вызвался нормально, видать проблема именно в xs
phenom x4 905e, asus m4a79 deluxe, 4 gb, ati x550, ati 4350, 2 x 17" LCD
Спасибо сказали:
vadiml
Сообщения: 446
ОС: fc12.x86_64

Re: perl, написание модулей

Сообщение vadiml »

нашел пример в ExtUtils::MakeMaker::FAQ, там есть пример по XS для нескольких файлов в одном пакете
теперь осталось разобраться с видимостью функций, т.к. там пример для С, а у меня С++ -- мне весь класс подтянуть надо, с конструктором и деструктором, в которых имя не подправишь как в том примере
phenom x4 905e, asus m4a79 deluxe, 4 gb, ati x550, ati 4350, 2 x 17" LCD
Спасибо сказали: