Ответ 1
Вы хотите посмотреть на использование XS, как Perl обычно взаимодействует с библиотеками C/С++. Это не совсем тривиально. Несколько соответствующих частей документации Perl:
Я пишу статическую библиотеку С++, которую нужно разделить между несколькими приложениями, одна из которых написана на Perl. К сожалению, я едва знаю основной язык Perl (я читал книгу Llama), и я не так хорошо знаком с его библиотеками. Как вы делаете вызовы на внешний С++ файл из Perl script?
В результате поиска Google я нашел информацию о модуле Perl Inline, но если я правильно его понимаю, это не то, что я необходимость. Я уверен, что для написания кода C и С++ непосредственно в ваших сценариях Perl, а не для вызова внешних библиотек С++.
Статическая библиотека С++ перекрестно скомпилирована для ARM-процессора, поэтому на целевой машине, где будет работать Perl script, не будет компилятора С++. (Если это имеет значение.)
Вы хотите посмотреть на использование XS, как Perl обычно взаимодействует с библиотеками C/С++. Это не совсем тривиально. Несколько соответствующих частей документации Perl:
Вы можете вызывать код из других библиотек через Inline:: C (и, вероятно, тот же через Inline:: CPP) - посмотрите Inline:: C:: Cookbook. Скорее всего, вы хотите начать с Inline, и после того, как вы закончите эксперимент, используйте полученный файл .XS для дальнейшей работы.
Во-первых, он должен находиться в динамической библиотеке, а не в статической библиотеке (если вы не будете перекомпилировать perl и привязать ее к своей статической библиотеке).
Во-вторых, поскольку С++ будет калечить имена (один из самых раздражающих "возможностей" С++, если вы спросите меня), вам понадобится блок extern "C", содержащий функции hook. Если вы использовали С++, вы могли бы пройти с помощью одной функции hook, которая возвращает объект С++, который реализует интерфейс, который вам нужно использовать. Поскольку вы используете perl, вам может понадобиться обернуть объект в интерфейс, подобный этому:
CPPObject object; extern "C" { int InitObject( void ) { return object.init(); } int DoCoolStuff( void ) { return object.DoCoolStuff(); } int DoOtherCoolStuff( int foo ) { return object.DoOtherCoolStuff( foo ); } int DestroyObject( void ) { return object.Destroy(); } }
Вам нужно создать функцию-обертку, которая может быть вызвана perl, и AFAIK, вам нужно, чтобы эта функция-оболочка находилась в динамической библиотеке (если вы не собираетесь перестроить билд Perl и связать статический lib с Это). Мне нравится использовать инструмент SWIG (Simple Wrapper Interface Generator) для создания оберток для меня. Он может создавать обертки для 17 или около того других языков.
Наверное, не то, о чем вы думаете, но как насчет написания автономной программы на С++, которую программа perl передает через каналы с помощью <
Я только начинаю обнимать вокруг XS, поэтому я не могу много помочь. Но вот что я знаю...
Существует XSpp, который является XS для С++. Он распространяется с WxPerl. WxPerl находится в активной и гибкой разработке.
Inline: CPP может использоваться для записи исходного кода интерфейса/оболочки. Затем вы можете проанализировать сгенерированный XS. Тем не менее, это выглядит не так хорошо. Если он работает, он может обеспечить вам хороший старт.
Вы можете найти эту короткую заметку о XS и С++ от John Keizer, если немного устарел.