首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用FFI:Platypus替换cpan实用程序P5NCI

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

Stack Overflow用户
提问于 2022-04-05 05:09:34
回答 2查看 99关注 0票数 1

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

代码语言:javascript
复制
    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,但我得到了如下错误:

代码语言:javascript
复制
Don't understand NCI signature 'ii'

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

代码语言:javascript
复制
perl -MCPAN -e shell
install FFI::Platypus

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

你好,阿米特·门德

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-05 11:54:59

下面是一个示例,说明如何使用FFI::PlatypusFFI::CheckLib来执行与P5NCI相同的操作

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2022-04-05 06:08:37

相当于

代码语言:javascript
复制
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 );

代码语言:javascript
复制
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

代码语言:javascript
复制
use Dynaloader qw( );

my $lib_path = DynaLoader::dl_findfile( 'ESNMP' )
   or die( ... );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71746590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档