У меня есть приложение, которое состоит из множества общих библиотек. Я написал расширения Perl для некоторых из них. Кроме того, я встроил Perl в приложение.
Я вызываю Perl-скрипт из C в C ++. Допустим, мои расширения perl называются SV :: Net :: Info и SV :: Interface, и мой файл perl выглядит следующим образом
use SV::Net::Info;
use SV::Interface;
#use IO::Socket;
...
...
...
Я могу прочитать Perl-скрипт из C ++ и отправить вывод обратно в 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-клей, как упомянуто здесь . Это не решило мою проблему, так как добавленный клей ищет символ boot_IO (который определен в файле IO.so). Я не могу связать свое приложение с IO.so, так как это файл, который Perl открывает во время выполнения, используя dlopen. (Кроме того, мое приложение должно работать на Windows, и Windows предоставляет только файл .dll, а не файл .lib). Какой выход?
Я думаю о написании функции-оболочки boot_IO, которая выполняет саму функцию boot_IO из IO.so во время выполнения, используя dlopen. Это единственный вариант?