在Active Perl脚本中使用Custom Made .DLL?

时间:2015-04-16 20:55:28

标签: windows perl dll load

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

正如您所看到的,我设法创建了三个文件:udunits2.dll,udunits2.lib和udunits2.exp,我已将它们复制到安装了Active Perl的另一个Windows框中。我将这三个文件复制到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本身可能没问题,因为我已按照说明进行操作。

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

  

使用UDUNITS2;#错误发生在这里。

你从哪里得到这个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是动态链接库udunits2.dll // .lib的接口,来自http://www.unidata.ucar.edu/software/udunits/(来自此处称为unidata / udunits2)

使用sh / configure / gcc编译unidata / udunits2并不意味着你已经安装了Physics :: Udunit2,Physics :: Udunit2需要安装步骤,这个步骤还包括使用gcc进行编译/链接并生成一个.dll,一个从unidata / udunits2链接到dll。

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

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

   perl Makefile.PL
   make
   make test
   make install

重要的是阅读/编辑https://metacpan.org/source/HEIKOK/Physics-Udunits2-0.03/Makefile.PL

Makefile.PL是Physics :: Udunits2告诉ExtUtils :: MakeMaker在哪里查找/链接udunits2.h和libudunits2,所以它可以编译Physics :: Udunits2并链接到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。