Sign in Join
Wiki copytemporary

Lazarus/FPC Libraries/es: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: Lazarus/FPC Libraries/es

OldNewLine
1+Esta página describe las posibilidades de creación de librerías con Lazarus/FPC y cómo usarlas en proyectos y paquetes.
2+
3+## Tópicos relacionados
4+
5+- [Creando vínculos/enlaces para librerías C](http://wiki.lazarus.freepascal.org/Creating_bindings_for_C_libraries) - Cómo convertir un fichero de cabecera C (.h) en una unidad pascal
6+
7+## General
8+
9+   **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)
10+
11+   **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.
12+
13+## Sistemas Operativos
14+
15+Librerías dinámicas:
16+
17+<center>
18+
19+| **Sistema Operativo** | **Librería dinámica** | **Librería estática** | '''Prefijo de la Librería |
20+|----|----|----|----|
21+| FreeBSD | .so | .a | lib |
22+| macOS | .dylib | .a | lib |
23+| Linux | .so | .a | lib |
24+| Windows | .dll | .lib | \- |
25+| Haiku | .so | .a | lib |
26+
27+</center>
28+
29+### FreeBSD, MacOSX y Linux
30+
31+   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.
32+
33+   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.
34+
35+   Usar ldconfig después de copiar el archivo de la librería en el directorio lib puede ayudar con los problemas del almacenamiento en caché.
36+
37+   Para 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.
38+
39+### Windows
40+
41+   Windows busca una librería en el directorio actual, en el directorio del sistema y finalmente en las rutas de la variable de entorno PATH.
42+
43+## ppumove, .ppu, .ppl
44+
45+   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.
46+
47+   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**.
48+
49+   Por ejemplo:
50+
51+   Estando en el directorio de salida de un paquete (donde está el fichero .ppu):
52+
53+` ppumove -o packagename -e ppl *.ppu`
54+
55+   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.
56+
57+   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**. Pero las secciones de iniciación y finalización (initialization/finalization) serán llamadas automaticamente. ESto incluye el inicio y finalización del controlador de la pila (heap manager). Esto implica que no hay cadenas o GetMem(¡?). Por supuesto los programadores pueden desechar esto y obtener más(¡?).
58+
59+## Cargando la librería dinámica
60+
61+   Cargar una librería dinámica es sencillo con la función **Loadlibrary** de la unidad **dynlibs** en Linux y con **LoadLibrary** de la unidad **windows** en windows.
62+
63+`  LibDir := Loadlibrary( 'ruta a la librería/libNOMBRELIBERIA.so', 1 ); //(Linux)`\
64+`  Asa := LoadLibrary('modulo.DLL');                              //(windows) `
65+
66+   Desde la versión 1.9.4, dynlibs proporciona una alternativa portable a la unidad dl. Hay que hacer notar que cualquier otro uso de la unidad dl no es sustituible por la unidad dynlibs y es típicamente no portable entre sistemas. Esto aconseja utilizar la unidad dynlibs en la medida de lo posible.
67+
68+   La mayor dificultad es obtener el nombre del fichero, ya que depende de la versión de la librería y del sistema operativo. Desde la versión 2.2.2, la constante "sharedsuffix" se declara en la unidad dynlibs para facilitar esta tarea. Esto permite hacer referencia a la parte relevante (dll/so/dylib) sin tener que prestar atención al prefijo.
69+
70+## Iniciación
71+
72+   Toda unidad tiene una sección de iniciación (Initialization). El orden de iniciación de las secciones depende del orden de las clausulas 'uses' de cada unidad.
73+
74+   Cómo iniciar (Initialization) una librería dinámica: ToDo
75+
76+## Finalización
77+
78+   Cada unidad tiene una sección de finalización (Finalization). El orden de proceso es el inverso de la iniciación.
79+
80+## Versiones, Distribución
81+
82+   Las librerías tienden a crecer y cambiar con el tiempo. Añadir nuevas funciones no implica problemas, pero eliminar un método público o cambiar sus parámetros hace la librería incompatible. Esto significa que, una vez instalada una librería (.so, .dll, .dylib) debe ser reemplazada por otra compatible o por el contrario la nueva librería deberá ser añadida al sistema. Por esto, cada librería contiene una versión.
83+
84+   Para cargar una librería dinámica hay que conocer su nombre correcto. En Linux esto significa, conocer el número de versión.
85+
86+   ToDo: propuesta sobre la forma en que el 'IDE' debe crear números de versión.
87+
88+## Ver también
89+
90+- [[macOS Programming Tips|macOS Programming Tips - Libraries]]
91+- [[macOS Dynamic Libraries]]
92+- [[macOS Static Libraries]]
93+- FPC [Librería compartida](http://wiki.lazarus.freepascal.org/shared_library/es)
94+- FPC [paquetes](http://wiki.lazarus.freepascal.org/packages)
95+
96+---
97+*From the Free Pascal wiki, page "Lazarus/FPC Libraries/es", as it stood on 2021-09-23 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history