2

我有一个应用程序,它由相当多的共享库组成。我已经为其中一些编写了 perl 扩展。此外,我已将 perl 嵌入到应用程序中。

我正在用 C++ 调用 perl 脚本。可以说,我的 perl 扩展名为 SV::Net::Info 和 SV::Interface,我的 perl 文件看起来像这样

use SV::Net::Info;
use SV::Interface;
#use IO::Socket;
...
...
...

我能够从 C++ 读取 perl 脚本并将输出发送回 C++,没有任何问题。当我取消注释第三行时出现问题,use IO::Socket;我收到错误消息说

Can't load module IO, dynamic loading not available in this perl.
(You may need to build a new perl executable which either supports
dynamic loading or has the IO module statically linked into it.)

这是因为 IO 本身就是一个 C 库。我已经添加了这里提到的 xs-glue 。它没有解决我的问题,因为添加的胶水正在寻找 boot_IO 符号(在 IO.so 文件中定义)。我无法将我的应用程序与 IO.so 链接,因为它是一个文件,perl 在运行时使用 dlopen 打开该文件。(另外,我的应用程序应该在 windows 上运行,windows 只提供 .dll 文件而不提供 .lib 文件)。出路是什么?

我正在考虑编写一个包装函数 boot_IO,它在运行时使用 dlopen 从 IO.so 运行实际的 boot_IO 函数。这是唯一的选择吗?

4

1 回答 1

1

听起来您需要静态链接IO::Socket的库,并且由于没有.a创建文件,这看起来是不可能的。你能改变你的代码来使用内置的套接字函数吗?

另一种选择是创建一个纯 Perl 实现IO::Socket

于 2011-07-26T11:17:49.400 回答