代码之家  ›  专栏  ›  技术社区  ›  Amit M

如何用FFI:Platypus替换cpan Perl实用程序P5NCI

  •  0
  • Amit M  · 技术社区  · 3 年前

    下面是调用P5NCI::load_func以加载函数load_library(签名为int load_library(int dummy))的perl代码,因此第三个参数作为ii传递给P5NCI::load_func

        my $library_path = P5NCI::find_lib( 'ESNMP.so' );
        $library      = P5NCI::load_lib( $library_path );
        print "\nLibrary loaded";
        print "\nlibrary_path".$library_path;
        my $funcldlib = P5NCI::load_func( $library, 'load_library', 'ii');
    

    这在perl-5.14之前一直运行良好,但后来我在perl-5.26.3中使用了它,但我得到的错误如下:

    Don't understand NCI signature 'ii'
    

    我正在考虑使用FFI鸭嘴兽。我使用以下步骤成功编译了Platypus:

    perl -MCPAN -e shell
    install FFI::Platypus
    

    想知道如何使用FFI::Platypus实现上述代码中提到的与P5NCI相同的目的

    当做 阿米特·门德

    0 回复  |  直到 3 年前
        1
  •  1
  •   Håkon Hægland    3 年前

    下面是一个如何使用 FFI::Platypus FFI::CheckLib 和你以前做的一样 P5NCI :

    use feature qw(say);
    use strict;
    use warnings;
    use FFI::Platypus;
    use FFI::CheckLib;
    
    my $libname = 'ESNMP';
    my @libs = find_lib(lib => $libname, libpath => './lib');
    die "Could not find libary '$libname'\n" if !@libs;
    my $libpath = $libs[0];
    my $ffi = FFI::Platypus->new();
    $ffi->lib( $libpath );
    my $function = $ffi->function('load_library', ['int'] => 'int');
    my $input_value = 2;
    my $return_value = $function->($input_value);
    say "Return value: ", $return_value;
    

    请注意,这假定当前目录下有一个名为 lib/libESNMP.so .这是我用来测试这个脚本的路径。我还假设有一个函数 load_library() 在共享库中定义,该库接受整数输入参数并返回整数。

        2
  •  1
  •   ikegami Gilles Quénot    3 年前

    相当于

    my $library_path = P5NCI::find_lib( 'ESNMP.so' );
    my $library      = P5NCI::load_lib( $library_path );
    my $funcldlib    = P5NCI::load_func( $library, 'load_library', 'ii' );
    
    my $j = $funcldlib->( $i );
    

    use FFI::Platypus qw( find_lib_or_die );
     
    my $ffi = FFI::Platypus->new( api => 1 );
    $ffi->lib( find_lib_or_die( lib => 'ESNMP' ) );
    $ffi->attach( load_library => [ 'int' ] => 'int' );
    
    my $j = load_library( $i );
    

    这几乎是一字不差地从 module's documentation 作者简介。以后请尝试回答自己的问题。

    注意,我发现一个函数调用 load_library 有一个 int 参数它的参数真的是一个 智力 ? 一根绳子似乎更有可能。但是,它被宣布为 智力 在P5NCI版本中,所以我将其声明为 智力 在FFI::鸭嘴兽版本中。