Как мне вызвать статическую библиотеку C ++ из Perl? - PullRequest
11 голосов
/ 09 января 2009

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

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

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

Ответы [ 6 ]

8 голосов
/ 09 января 2009

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

5 голосов
/ 09 января 2009

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

4 голосов
/ 09 января 2009

Во-первых, он должен находиться в динамической библиотеке, а не в статической (если вы не будете перекомпилировать сам Perl и связывать его со своей статической библиотекой).

Во-вторых, поскольку C ++ будет искажать имена (одна из самых раздражающих «особенностей» C ++, если вы спросите меня), вам понадобится внешний блок «C», который содержит функции перехвата. Если бы вы использовали C ++, вы, вероятно, могли бы обойтись с помощью единственной функции-ловушки, которая возвращает объект C ++, который реализует интерфейс, который вам нужно использовать. Поскольку вы используете 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();
}

}
2 голосов
/ 09 января 2009

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

1 голос
/ 09 января 2009

Возможно, не то, что вы думаете, а как насчет написания отдельной программы на C ++, с которой perl-программа взаимодействует через каналы?

0 голосов
/ 25 февраля 2009

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

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

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

Вы можете найти эту короткую заметку о XS и C ++ Джона Кейзера полезной, если она устарела.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...