如何找到Perl共享对象目录?

3
我刚刚购买了一个商业perl共享对象,但是它的文档非常简洁。具体来说,它是一个“.so”文件,我知道它需要放到perl用来查找共享对象的任何目录中。
通常我会遇到“.pm”文件,并且知道如何轻松安装它们,但这是我第一次使用perl中必须安装“.so”文件或将其复制到目录中的东西。
有人知道我该如何找到这个目录吗?这是Perl的内部细节,我不熟悉(我也更喜欢培根。哈哈!)。 珍妮
更新:(为了更清晰)。销售此文件的公司将文件命名为“hcmodule.so”。他们的示例perl脚本中有一个“use hcmodule”的使用指令,后面还有一个调用...
$retval = hcmodule( ........ <SNIP>..);

如果这有助于使事情变得更加清晰。

1
似乎很奇怪为某物支付钱款,然后向社区寻求支持。 毫无疑问,要么库的供应商可以告诉您如何使其工作,要么他们应该退还您的钱款。 - Grant McLean
1
Grant,问题是perl共享对象目录在哪里找到。这非常适合S.O.,并不是关于产品本身的支持问题。谢谢。 - Jane Wilkie
2个回答

7

Perl从其lib目录下的目录加载共享对象。在某些Perl安装中,这将是与找到主Perl二进制文件的bin目录平行的lib目录。在某些系统中,它将位于其他位置。例如,我自己构建的Perl(MacOS X上的5.14.1)显示以下内容(从perl -V的输出的一部分):

@INC
/Users/jleffler/Perl/v5.14.1-64/lib/perl5/site_perl/5.14.1/darwin-2level
/Users/jleffler/Perl/v5.14.1-64/lib/perl5/site_perl/5.14.1
/Users/jleffler/Perl/v5.14.1-64/lib/perl5/5.14.1/darwin-2level
/Users/jleffler/Perl/v5.14.1-64/lib/perl5/5.14.1

另一方面,系统中的 Perl (5.12.3) 报告如下:

@INC:
/Library/Perl/5.12/darwin-thread-multi-2level
/Library/Perl/5.12
/Network/Library/Perl/5.12/darwin-thread-multi-2level
/Network/Library/Perl/5.12
/Library/Perl/Updates/5.12.3
/System/Library/Perl/5.12/darwin-thread-multi-2level
/System/Library/Perl/5.12
/System/Library/Perl/Extras/5.12/darwin-thread-multi-2level
/System/Library/Perl/Extras/5.12

在MacOS X上共享对象的扩展名为.bundle(而不是.so),我拥有的一些捆绑包如下:

.../lib/perl5/site_perl/5.14.1/darwin-2level/auto/DBD/Informix/Informix.bundle
.../lib/perl5/site_perl/5.14.1/darwin-2level/auto/DBD/SQLite/SQLite.bundle
.../lib/perl5/site_perl/5.14.1/darwin-2level/auto/DBI/DBI.bundle

对应的 PM 文件为:

.../lib/perl5/site_perl/5.14.1/darwin-2level/DBD/Informix.pm
.../lib/perl5/site_perl/5.14.1/darwin-2level/DBD/SQLite.pm
.../lib/perl5/site_perl/5.14.1/darwin-2level/DBI.pm

无论如何,Perl都会期望在与模块名称相关的目录中查找.so文件。应该有安装说明,尤其是您已经付费购买了该模块。至少会有一个共享对象和一个.pm文件需要安装,在两个相关的目录中。

4
你是否尝试过运行perl -V来查看是否有你需要的信息?你是否设置了环境变量LD_LIBRARY_PATH?
我在Linux上执行perl -V(大写的V),结果显示Perl库位于/usr/lib/perl/5.10和其他一些库中。
请问你购买了哪个Perl的*.so文件?我从来没有听说过有人销售Perl共享库。

5
值得一提的是,Perl二进制API在不同版本之间会发生变化,因此当您从Perl 5.10升级到Perl 5.12(例如)时,这个“.so”文件将变成南瓜。 - user149341
感谢David W。销售Perl的.so是有道理的。如果您足够聪明以安装.pm,那么您也足够聪明来进行反向工程。.so作为二进制文件使得反向工程比仅使用纯文本编辑器查看脚本要困难得多。我从事的行业非常专业(医疗保健),其中广泛使用Perl。对于像你和我这样从未购买过.so的人而言,这就是问题所在。如果他们的商业模式奏效,那就更好了。我不想重新发明轮子,并且我们在这方面的投资是值得的。 - Jane Wilkie
1
那么,*.so文件如何使用?肯定有一个*.pm模块调用它。在这种情况下,它应该在@INC中的auto目录中。您可以运行此命令perl -e 'print join "\n", @INC;'并获取您的模块使用的目录列表。在那里,有一个auto目录,您可以将.so文件放在其中。在auto下面,它可能与使用它的.pm文件具有相同的目录结构。是否也有一个*.pm文件? - David W.
嗨,David。最终我发现编译.so文件所使用的perl版本是5.8。我使用perlbrew找出了这个问题(需要时非常好用)。这里有一个很棒的链接,讲解了XS模块接口。https://bugs.archlinux.org/task/9078 JW - Jane Wilkie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接