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++ に送り返すことができます。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 を作成することを考えています。これが唯一のオプションですか?

4

1 に答える 1

1

IO::Socketのライブラリを静的にリンクする必要があるようですが.a、ファイルが作成されていないため、それは不可能のようです。組み込みのソケット関数を使用するようにコードを変更できますか?

別のオプションは、 の純粋な Perl 実装を作成することですIO::Socket

于 2011-07-26T11:17:49.400 に答える