かなりの数の共有ライブラリで構成されているアプリケーションがあります。私はそれらのいくつかに perl 拡張機能を書きました。また、アプリケーションに perl を組み込みました。
C++ で perl スクリプトを呼び出しています。たとえば、私の perl 拡張機能の名前は SV::Net::Info および SV::Interface で、私の perl ファイルは次のようになっています。
use SV::Net::Info;
use SV::Interface;
#use IO::Socket;
...
...
...
C++ から perl スクリプトを読み取り、問題なく出力を C++ に送り返すことができます。3行目のコメントを外すと問題が発生し、次の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 は .lib ファイルではなく .dll ファイルのみを提供します)。抜け道は?
dlopen を使用して実行時に IO.so から実際の boot_IO 関数を実行するラッパー関数 boot_IO を作成することを考えています。これが唯一のオプションですか?