Sign in Join
Wiki copytemporary

Lazarus/FPC Libraries/es: what changed

Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11Esta página describe las posibilidades de creación de librerías con Lazarus/FPC y cómo usarlas en proyectos y paquetes.
22
33## Tópicos relacionados
44
55- [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
66
77## General
88
99   **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)
1010
1111   **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.
1212
1313## Sistemas Operativos
1414
1515Librerías dinámicas:
1616
1717| **Sistema Operativo** | **Librería dinámica** | **Librería estática** | '''Prefijo de la Librería |
1818|----|----|----|----|
1919| FreeBSD | .so | .a | lib |
2020| macOS | .dylib | .a | lib |
2121| Linux | .so | .a | lib |
2222| Windows | .dll | .lib | \- |
2323| Haiku | .so | .a | lib |
2424
2525### FreeBSD, MacOSX y Linux
2626
2727   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.
2828
2929   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.
3030
3131   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é.
3232
3333   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.
3434
3535### Windows
3636
3737   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.
3838
3939## ppumove, .ppu, .ppl
4040
4141   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.
4242
4343   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**.
4444
4545   Por ejemplo:
4646
4747   Estando en el directorio de salida de un paquete (donde está el fichero .ppu):
4848
49-` ppumove -o packagename -e ppl *.ppu`
49+```text
50+ ppumove -o packagename -e ppl *.ppu
51+```
5052
5153   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.
5254
5355   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(¡?).
5456
5557## Cargando la librería dinámica
5658
5759   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.
5860
59-`  LibDir := Loadlibrary( 'ruta a la librería/libNOMBRELIBERIA.so', 1 ); //(Linux)`\
60-`  Asa := LoadLibrary('modulo.DLL');                              //(windows) `
61+``` pascal
62+ LibDir := Loadlibrary( 'ruta a la librería/libNOMBRELIBERIA.so', 1 ); //(Linux)
63+ Asa := LoadLibrary('modulo.DLL'); //(windows)
64+```
6165
6266   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.
6367
6468   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.
6569
6670## Iniciación
6771
6872   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.
6973
7074   Cómo iniciar (Initialization) una librería dinámica: ToDo
7175
7276## Finalización
7377
7478   Cada unidad tiene una sección de finalización (Finalization). El orden de proceso es el inverso de la iniciación.
7579
7680## Versiones, Distribución
7781
7882   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.
7983
8084   Para cargar una librería dinámica hay que conocer su nombre correcto. En Linux esto significa, conocer el número de versión.
8185
8286   ToDo: propuesta sobre la forma en que el 'IDE' debe crear números de versión.
8387
8488## Ver también
8589
8690- [[macOS Programming Tips|macOS Programming Tips - Libraries]]
8791- [[macOS Dynamic Libraries]]
8892- [[macOS Static Libraries]]
8993- FPC [Librería compartida](http://wiki.lazarus.freepascal.org/shared_library/es)
9094- FPC [paquetes](http://wiki.lazarus.freepascal.org/packages)
9195
9296---
9397*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