下面是perl代码,它调用P5NCI::load_func将具有签名的函数load_library加载为int load_library(int Load_library),因此第三个参数作为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代码中提到的相同目的。
你好,阿米特·门德
发布于 2022-04-05 11:54:59
下面是一个示例,说明如何使用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()的函数,它接受一个整数输入参数并返回一个整数。
发布于 2022-04-05 06:08:37
相当于
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 );这几乎是从模块文档的概要中逐字复制出来的。请在将来尝试回答你自己的问题。
注意,我发现一个名为load_library的函数有一个int参数是非常可疑的。它的参数真的是int吗?一根线似乎更有可能。但是,在int版本中,它被声明为P5NCI,所以我在FFI::int版本中将它声明为int。
请注意,FFI将查找libESNMP.so,但您似乎有一个非常规命名库。您可以使用与P5NCI相同的函数来查找它,而不是使用find_lib_or_die。
use Dynaloader qw( );
my $lib_path = DynaLoader::dl_findfile( 'ESNMP' )
or die( ... );https://stackoverflow.com/questions/71746590
复制相似问题