Как связать статический объектный файл C с Perl? - PullRequest
5 голосов
/ 28 сентября 2010

У меня есть функция, написанная на C (скажем, в файле HelloWorld.c).Я хочу скомпилировать это и мне нужно создать файл статических объектов HelloWorld.a

Наконец, мне нужно вызвать это из Perl-программы (HelloWorld.pl).

Ответы [ 3 ]

9 голосов
/ 28 сентября 2010

Для вызова из perl в C обычно компилируют разделяемую, а не статическую библиотеку из своего кода c, а затем загружают ее в интерпретатор perl с помощью модуля XSLoader или DynaLoader.

Чтобы потом можно было вызывать код C из пространства Perl, есть много способов.Наиболее распространенным является написание чего-то, называемого XSUB s, которое имеет интерфейс на стороне perl, сопоставляет соглашения о вызовах perl с соглашениями о вызовах C и вызывает функции C.Эти XSUB обычно также связаны с общей библиотекой, которая будет загружена в perl, и написаны на языке XS, который подробно документирован в perlxs и perlxstut .

Есть и другие способы создания этого слоя-оболочки, такие как различные генераторы кода XS, а также SWIG.Но вы также можете вызывать функции C напрямую, используя NCI.Perl также имеет много таких.P5NCI - один из примеров, модуль ctypes, разработанный в программе Google Summer of Code этого года, - другой.

Другой связанный метод, который, вероятно, следует упомянуть здесь, это Inline::C, а другие модулиInline семья.Они позволяют вам писать код на других языках прямо в Perl и вызывать его.Inline :: C просто создает код XS и загружает результат в интерпретатор.

3 голосов
/ 28 сентября 2010

Как говорит @rafl, вам следует использовать разделяемую библиотеку.

Если вам нужно использовать статическую библиотеку, вам придется перестраивать Perl со встроенной статической библиотекой. Вам также понадобится немного клея XS,Тем не менее, это достаточно грязно, что вы действительно, действительно не хотите этого делать.

2 голосов
/ 29 сентября 2010

Согласно perlxstut :

Обычно считается, что если система не имеет возможности динамически загружать библиотеку, вы не можете создавать XSUB.Это неверноВы можете создать их, но вы должны связать подпрограммы XSUB с остальным Perl, создав новый исполняемый файл.Эта ситуация аналогична Perl 4.

Этот учебник все еще можно использовать в такой системе.Механизм сборки XSUB проверит систему и, если возможно, создаст динамически загружаемую библиотеку или статическую библиотеку, а затем, при необходимости, новый статически связанный исполняемый файл с этой статической библиотекой, связанной с ней.

По вашему желаниючтобы создать статически связанный исполняемый файл в системе, которая может динамически загружать библиотеки, вы можете во всех следующих примерах, где выполняется команда "make" без аргументов, вместо нее выполнить команду "make perl".

Если вы сгенерировали такой статически связанный исполняемый файл по выбору, тогда вместо «make test» вы должны сказать «make test_static».В системах, которые вообще не могут создавать динамически загружаемые библиотеки, достаточно просто сказать «make test».

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