我有一个应用程序,它由相当多的共享库组成。我已经为其中一些编写了 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 函数。这是唯一的选择吗?