在 Active Perl 脚本中使用定制的 .DLL?

Using a Custom Made .DLL inside Active Perl Scripts?

有关背景信息,请参阅:Migration of Perl Code to Windows: Missing Udunits Package?

如您所见,我成功地创建了三个文件:udunits2.dll、udunits2.lib 和 udunits2.exp,并且我已将它们复制到另一个 Windows 框中安装了活动 Perl。我将这三个文件复制到 c:\windows\system32 和 C:\Perl64\bin 以及相对于调用 Perl .pm 文件但没有成功。我试过像这样的语法:

my $UDUNITS2 = Win32::LoadLibrary('C:\Perl64\bin\udunits2.dll');
if(not defined $UDUNITS2) {
  die "Can't import API UDUNITS2";# this doesn't get hit
}
use UDUNITS2;# error happens here.

原始(Linux 代码)使用的是较旧的 udunits 库;根据链接的 S.O 页面,我已经成功地编译了 udunits2。

当我 运行 此代码时,我得到:无法在 @INC

中加载 UDUNITS2.pm

我一定跑远了?!我的猜测是我的 DLL 缺少一些 .Def(定义)文件,这就是 Perl 引擎找不到它的原因?请注意,我认为 udunits2.dll 本身可能没问题,因为我已按照说明进行操作。

有什么想法吗?

谢谢!

use UDUNITS2;# error happens here.

你从哪里得到这个 perl 模块?

UDUNITS2.pm... 支持文件应该与 udunits2.dll/.lib...

接口

其工作原理的示例是 perlxstut/SOso-0.01.patch.txt

LoadLibrary 实际上从未用于此

更新:2015-04-21-19:28:42

你声称你的代码依赖于一个 perl 模块 UDUNITS2.pm 但我在 cpan(或互联网)上找不到这样的模块。

cpan 上有一个名为 Physics::Udunits2 的 perl 模块。

perl模块Physics::Udunits2是动态link库udunits2.dll//.lib的一个接口,来自http://www.unidata.ucar.edu/software/udunits/的(以下简称作为 unidata/udunits2 )

使用 sh/configure/gcc 编译 unidata/udunits2... 并不意味着您已经安装了 Physics::Udunit2,Physics::Udunit2 需要安装步骤,该步骤还包括 compilation/linking 使用 gcc 并生成一个 .dll,其中 link 从 unidata/udunits2.

到 dll

SOso-0.01.patch.txt 是最简单的 perl xs 模块的示例,它需要编译并生成一个 .dll,但它不会 link 到其他库 9,例如 unidata/udunits2)

https://metacpan.org/source/HEIKOK/Physics-Udunits2-0.03/README解释基本步骤 要安装此模块,请键入以下内容:

   perl Makefile.PL
   make
   make test
   make install

对你来说重要的是 read/edit https://metacpan.org/source/HEIKOK/Physics-Udunits2-0.03/Makefile.PL

Makefile.PL是Physics::Udunits2告诉ExtUtils::MakeMakerfind/linkudunits2.h和libudunits2的地方,所以它可以编译Physics::Udunits2和link 反对 unidata/udunits2

现在明白了吗?打开 Makefile.PL 并将 INCLUDE/LIBS 编辑为类似

的内容
#~     LIBS              => ["-L$udunits_lib_path".' -ludunits2 -lm'], # e.g., '-lm'
#~     LIBS              => ["-L/path/to/udunits2dotlib  -llibudunits2.lib" ],
    LIBS              => [ "-l/full/path/to/libudunits2.lib" ],
#~     INC               => "-I. -I$udunits_inc_path",
    INC               => "-I. -I/path/to/udunits2doth",

将 .dll 从 unidata/udunits2 重命名为类似 libudunits2.dll 的名称也是一个好主意...因为 Physics::Udunits2 将生成一个 Physics/Udunits2.dll它自己的。