2010-09-28 9 views
5

Tengo una función escrita en C (Say en el archivo HelloWorld.c). Quiero compilar esto y necesito crear un archivo de objeto estático HelloWorld.a¿Cómo puedo vincular un archivo de objeto C estático a Perl?

Finalmente necesito llamar a esto desde un programa Perl (HelloWorld.pl).

+2

[¿Cómo puedo acceder a los archivos de una biblioteca en Perl?] (Http: // stackoverflow.com/q/3733346) – daxim

+0

Si solo quiere ejecutar un poco de código C desde perl, compilarlo como un programa de C independiente y llamarlo por la línea de comando puede funcionar :) O tal vez algo como gearman podría ser útil. –

Respuesta

9

Para llamar desde perl a C, normalmente compila una biblioteca compartida, no estática, desde su código c, y luego la carga en el intérprete Perl utilizando el módulo XSLoader o DynaLoader.

Para poder llamar al código C desde el espacio perl, hay muchas formas. El más común es escribir algo llamado XSUB s, que tienen una interfaz perl-side, asignar las convenciones de llamadas perl a C-convenciones de llamadas y llamar a las funciones C. Esos XSUB generalmente también están vinculados a la biblioteca compartida que se cargará en Perl y se escribirá en un lenguaje llamado XS, que está ampliamente documentado en perlxs y perlxstut.

También hay otras formas de construir esa capa de envoltura, como varios generadores de código XS, así como SWIG. Pero también puede llamar a las funciones C directamente usando un NCI. Perl también tiene muchos de esos. El P5NCI es un ejemplo de eso, el módulo ctypes desarrollado en el programa Google Summer of Code de este año es otro.

Otra técnica relacionada que probablemente debería mencionarse aquí es Inline::C, y los otros módulos de la familia Inline. Le permiten escribir código en otros idiomas directamente en perl y llamar a él. Debajo del capó, Inline :: C solo crea código XS y carga el resultado de eso en el intérprete.

3

Como dice @rafl, debe usar una biblioteca compartida.

Si debe usar una biblioteca estática, entonces debe reconstruir Perl con la biblioteca estática integrada. También necesitará un poco de pegamento XS. Sin embargo, esto es lo suficientemente complicado como para que realmente, realmente no quieras hacerlo.

2

Según perlxstut:

Se piensa comúnmente que si un sistema no tiene la capacidad de cargar dinámicamente una biblioteca, no se puede construir XSUBs. Esto es incorrecto. Puede compilarlos, pero debe vincular las subrutinas de XSUB con el resto de Perl, creando un nuevo ejecutable. Esta situación es similar a Perl 4.

Este tutorial aún se puede utilizar en un sistema de este tipo. El mecanismo de compilación XSUB comprobará el sistema y compilará una biblioteca cargable dinámicamente si es posible, o bien una biblioteca estática y luego, opcionalmente, un nuevo ejecutable enlazado estáticamente con esa biblioteca estática vinculada.

Si desea construir un ejecutable enlazado estáticamente en un sistema que puede cargar dinámicamente bibliotecas, puede, en todos los ejemplos siguientes, donde se ejecuta el comando "make" sin argumentos, ejecute el comando "make perl" en su lugar.

Si ha generado un ejecutable enlazado estáticamente por elección, en lugar de decir "make test", debe decir "make test_static". En sistemas que no pueden construir librerías cargables dinámicamente, basta con decir "make test".

Cuestiones relacionadas