下面是呼叫 P5NCI::load_func 以加載具有 int load_library(int dummy) 簽名的函式 load_library 的 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 鴨嘴獸。我已經使用以下步驟成功編譯了鴨嘴獸:
perl -MCPAN -e shell
install FFI::Platypus
想知道如何使用 FFI::Platypus 來實作與上面代碼中提到的 P5NCI 相同的目的
問候, 阿米特·門德
uj5u.com熱心網友回復:
這是一個示例,說明如何使用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()在共享庫中定義了一個函式,它接受一個整數輸入引數并回傳一個整數。
uj5u.com熱心網友回復:
相當于
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 版本中被宣告為 an,所以我int在 FFI::Platypus 版本中將其宣告為 an。
請注意,FFI 將查找libESNMP.so,但您似乎有一個非常規命名的庫。您可以使用與 P5NCI 相同的函式來查找它,而不是使用find_lib_or_die.
use Dynaloader qw( );
my $lib_path = DynaLoader::dl_findfile( 'ESNMP' )
or die( ... );
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/464672.html
