Вставить Perl в C вопрос - PullRequest
2 голосов
/ 26 июля 2011

У меня есть приложение, которое состоит из множества общих библиотек. Я написал расширения 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. Это единственный вариант?

1 Ответ

1 голос
/ 26 июля 2011

Похоже, вам нужно статически связать библиотеку IO::Socket, и, поскольку файл .a не создан, похоже, что это невозможно. Можете ли вы изменить свой код для использования встроенных функций сокетов?

Другим вариантом будет создание чистой реализации Perl IO::Socket.

...