Как вызвать старую библиотеку С++ из Perl?

Я пишу статическую библиотеку С++, которую нужно разделить между несколькими приложениями, одна из которых написана на Perl. К сожалению, я едва знаю основной язык Perl (я читал книгу Llama), и я не так хорошо знаком с его библиотеками. Как вы делаете вызовы на внешний С++ файл из Perl script?

В результате поиска Google я нашел информацию о модуле Perl Inline, но если я правильно его понимаю, это не то, что я необходимость. Я уверен, что для написания кода C и С++ непосредственно в ваших сценариях Perl, а не для вызова внешних библиотек С++.

Статическая библиотека С++ перекрестно скомпилирована для ARM-процессора, поэтому на целевой машине, где будет работать Perl script, не будет компилятора С++. (Если это имеет значение.)

Ответ 1

Вы хотите посмотреть на использование XS, как Perl обычно взаимодействует с библиотеками C/С++. Это не совсем тривиально. Несколько соответствующих частей документации Perl:

Ответ 2

Вы можете вызывать код из других библиотек через Inline:: C (и, вероятно, тот же через Inline:: CPP) - посмотрите Inline:: C:: Cookbook. Скорее всего, вы хотите начать с Inline, и после того, как вы закончите эксперимент, используйте полученный файл .XS для дальнейшей работы.

Ответ 3

Во-первых, он должен находиться в динамической библиотеке, а не в статической библиотеке (если вы не будете перекомпилировать 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();
}

}

Ответ 4

Вам нужно создать функцию-обертку, которая может быть вызвана perl, и AFAIK, вам нужно, чтобы эта функция-оболочка находилась в динамической библиотеке (если вы не собираетесь перестроить билд Perl и связать статический lib с Это). Мне нравится использовать инструмент SWIG (Simple Wrapper Interface Generator) для создания оберток для меня. Он может создавать обертки для 17 или около того других языков.

Ответ 5

Наверное, не то, о чем вы думаете, но как насчет написания автономной программы на С++, которую программа perl передает через каналы с помощью <

Ответ 6

Я только начинаю обнимать вокруг XS, поэтому я не могу много помочь. Но вот что я знаю...

Существует XSpp, который является XS для С++. Он распространяется с WxPerl. WxPerl находится в активной и гибкой разработке.

Inline: CPP может использоваться для записи исходного кода интерфейса/оболочки. Затем вы можете проанализировать сгенерированный XS. Тем не менее, это выглядит не так хорошо. Если он работает, он может обеспечить вам хороший старт.

Вы можете найти эту короткую заметку о XS и С++ от John Keizer, если немного устарел.