Difference between revisions of "Lazarus/FPC Libraries/es"
Line 52: | Line 52: | ||
FPC normalmente crea por cada unidad un fichero .ppu y otro .o. El fichero '''.ppu''' contiene todos los datos importantes de la unidad .pas/.pp (tipos, otros ficheros necesarios, cómo .o), mientras que el fichero '''.o''' contiene el código objeto (ensamblado) y los nombres simbólicos entendible por el sistema actual. | FPC normalmente crea por cada unidad un fichero .ppu y otro .o. El fichero '''.ppu''' contiene todos los datos importantes de la unidad .pas/.pp (tipos, otros ficheros necesarios, cómo .o), mientras que el fichero '''.o''' contiene el código objeto (ensamblado) y los nombres simbólicos entendible por el sistema actual. | ||
− | La herramienta '''ppumove''' incluida en cualquier instalación de, convierte uno o más ficheros .ppu y .o en una librería dinámica. Esta tarea la realiza llamando al enlazador para reunir el contenido de todos los ficheros en un fichero '''.so''' (windows | + | La herramienta '''ppumove''' incluida en cualquier instalación de, convierte uno o más ficheros .ppu y .o en una librería dinámica. Esta tarea la realiza llamando al enlazador para reunir el contenido de todos los ficheros en un fichero '''.so''' (en windows, '''.dll''') y elimina las referencias a los ficheros .o de los ficheros .ppu. Estos nuevos ficheros .ppu son normalmente nombrados como '''.ppl'''. |
Por ejemplo: | Por ejemplo: | ||
Line 60: | Line 60: | ||
ppumove -o packagename -e ppl *.ppu | ppumove -o packagename -e ppl *.ppu | ||
− | Esta orden convierte todos los ficheros .ppu en ficheros .ppl y crea un fichero 'libpackagename.so' (windows | + | Esta orden convierte todos los ficheros .ppu en ficheros .ppl y crea un fichero 'libpackagename.so' (en windows, packagename.dll). Resaltar que en Linux el prefijo 'lib' es añadido siempre. |
− | + | Esta nueva librería puede ser utilizada por otros lenguajes de programación, cómo C ( y en windows cualquiera que pueda hacer uso de una .dll). Y así mismo por programas FPC haciendo uso del modificador '''external'''. But the initialization/finalization sections must be called automatically. This includes the initialization/finalization of the heap manager. This means no strings or GetMem. Of course FPC programmers are spoiled and they can get more. | |
==dlopen - loading a dynamic library== | ==dlopen - loading a dynamic library== |
Revision as of 19:41, 27 May 2008
│
English (en) │
español (es) │
français (fr) │
日本語 (ja) │
русский (ru) │
Esta página describe las posibilidades de creación de librerias con Lazarus/FPC y cómo usarlas en proyectos y paquetes.
Tópicos relacionados
- Creando vínculos/enlaces para librerías C - Cómo convertir un fichero de cabecera C (.h) en una unidad pascal
- Creating bindings for C libraries - How to convert C header files (.h) to pascal units
General
Enlace estático: FPC compila y enlaza por defecto los ejecutables estáticamente. Esto significa que instruye al enlazador para que ponga todos los ficheros objeto (.o) del proyecto y todos los paquetes en un gran ejecutable. Ventajas: no hay dependencias externas. Desventajas: No se comparte el código entre diferentes programas en la misma máquina. Y no se pueden cargar o descargar utilidades "conectables" (plugins)
Librerías dinámicas: La idea de la librería dinámica es compartir código entre programas, ahorrando memoria ocupada por el código, reduciendo el tiempo de iniciación requerido por las librerías y permitiendo utilidades "conectables". Las desventajas de las librerías dinámicas son: son más lentas en las librerías menos usadas, su estructura y funcionamiento interno son más complicados (esto es principalmente un problema para el compilador), su iniciación es diferente (ver más abajo) y compartir el código implica que las versiones del código en el sistema sean compatibles.
Sistemas Operativos
Librerías dinámicas:
Sistema Operativo | Librería dinámica | Librería estática |
---|---|---|
FreeBSD | .so | .a |
MacOSX | .dylib | ? |
Linux | .so | .a |
Windows | .dll | .lib |
FreeBSD
MacOSX
Linux
El nombre de fichero de una librería dinámica tiene siempre la forma 'lib'+nombrepaquete+'.so'+versión. Por ejemplo:libz.so.1 and libz.so.1.2.2.
Linux busca una librería en la ruta de la variable de entorno LD_LIBRARY_PATH, después en /lib, después en /usr/lib y finalmente en las rutas de /etc/ld.so.conf.
Pra compartir memoria (GetMem/FreeMem, strings -cadenas-) con otras librerías (no escritas en FPC) en Linux hay que utilizar unit cmem. Esta unidad hay que añadirla como la verdadera primera unidad de la sección "uses" del fichero principal del proyecto (normalmente .lpr), para que su sección de iniciación sea llamada antes de que cualquier otra unidad pueda asignar memoria.
Windows
Windows busca una librería en el directorio actual, en el directorio del sistema y fianlmente en las rutas de la variable de entorna PATH.
ppumove, .ppu, .ppl
FPC normalmente crea por cada unidad un fichero .ppu y otro .o. El fichero .ppu contiene todos los datos importantes de la unidad .pas/.pp (tipos, otros ficheros necesarios, cómo .o), mientras que el fichero .o contiene el código objeto (ensamblado) y los nombres simbólicos entendible por el sistema actual.
La herramienta ppumove incluida en cualquier instalación de, convierte uno o más ficheros .ppu y .o en una librería dinámica. Esta tarea la realiza llamando al enlazador para reunir el contenido de todos los ficheros en un fichero .so (en windows, .dll) y elimina las referencias a los ficheros .o de los ficheros .ppu. Estos nuevos ficheros .ppu son normalmente nombrados como .ppl.
Por ejemplo:
Estando en el directorio de salida de un paquete (donde está el fichero .ppu):
ppumove -o packagename -e ppl *.ppu
Esta orden convierte todos los ficheros .ppu en ficheros .ppl y crea un fichero 'libpackagename.so' (en windows, packagename.dll). Resaltar que en Linux el prefijo 'lib' es añadido siempre.
Esta nueva librería puede ser utilizada por otros lenguajes de programación, cómo C ( y en windows cualquiera que pueda hacer uso de una .dll). Y así mismo por programas FPC haciendo uso del modificador external. But the initialization/finalization sections must be called automatically. This includes the initialization/finalization of the heap manager. This means no strings or GetMem. Of course FPC programmers are spoiled and they can get more.
dlopen - loading a dynamic library
Loading a dynamic library is simple with the dlopen function of the unit dl.
ToDo: give an example
The main problem is to get the filename, which depends on the version and the operating system.
Initialization
Every unit can contain an initialization section. The order of the initialization sections depend on the uses sections of each unit.
How to initialize a dynamic library: ToDo
Finalization
Every unit can contain an finalization section. The order is the reverse order of the initialization sections.
Versions, Distribution
Libraries tend to grow and change over time. Adding new features is no problem, but removing a public method or changing its parameters makes the library incompatible. That means either an installed library (.so, .dll, .dylib) is replaced by a compatible one or a new library must be added to the system. That's why every library contains a version.
To load a dynamic library (dlopen of unit dl) the correct filename must be known. Under Linux this means, you have to know the version number.
ToDo: proposal how the IDE should create version numbers
See Also
- FPC shared library
- FPC packages