Lazarus/FPC Libraries/es: what changed
Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.
| Old | New | Line | |
|---|---|---|---|
| 1 | 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 | 2 | ||
| 3 | 3 | ## Tópicos relacionados | |
| 4 | 4 | ||
| 5 | 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 | 6 | ||
| 7 | 7 | ## General | |
| 8 | 8 | ||
| 9 | 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 | 10 | ||
| 11 | 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 | 12 | ||
| 13 | 13 | ## Sistemas Operativos | |
| 14 | 14 | ||
| 15 | 15 | Librerías dinámicas: | |
| 16 | 16 | ||
| 17 | - | ||
| 18 | - | ||
| 19 | 17 | | **Sistema Operativo** | **Librería dinámica** | **Librería estática** | '''Prefijo de la Librería | | |
| 20 | 18 | |----|----|----|----| | |
| 21 | 19 | | FreeBSD | .so | .a | lib | | |
| 22 | 20 | | macOS | .dylib | .a | lib | | |
| 23 | 21 | | Linux | .so | .a | lib | | |
| 24 | 22 | | Windows | .dll | .lib | \- | | |
| 25 | 23 | | Haiku | .so | .a | lib | | |
| 26 | - | ||
| 27 | - | ||
| 28 | 24 | ||
| 29 | 25 | ### FreeBSD, MacOSX y Linux | |
| 30 | 26 | ||
| 31 | 27 | 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 | 28 | ||
| 33 | 29 | 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 | 30 | ||
| 35 | 31 | 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 | 32 | ||
| 37 | 33 | 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 | 34 | ||
| 39 | 35 | ### Windows | |
| 40 | 36 | ||
| 41 | 37 | 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 | 38 | ||
| 43 | 39 | ## ppumove, .ppu, .ppl | |
| 44 | 40 | ||
| 45 | 41 | 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 | 42 | ||
| 47 | 43 | 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 | 44 | ||
| 49 | 45 | Por ejemplo: | |
| 50 | 46 | ||
| 51 | 47 | Estando en el directorio de salida de un paquete (donde está el fichero .ppu): | |
| 52 | 48 | ||
| 53 | 49 | ` ppumove -o packagename -e ppl *.ppu` | |
| 54 | 50 | ||
| 55 | 51 | 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 | 52 | ||
| 57 | 53 | 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 | 54 | ||
| 59 | 55 | ## Cargando la librería dinámica | |
| 60 | 56 | ||
| 61 | 57 | 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 | 58 | ||
| 63 | 59 | ` LibDir := Loadlibrary( 'ruta a la librería/libNOMBRELIBERIA.so', 1 ); //(Linux)`\ | |
| 64 | 60 | ` Asa := LoadLibrary('modulo.DLL'); //(windows) ` | |
| 65 | 61 | ||
| 66 | 62 | 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 | 63 | ||
| 68 | 64 | 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 | 65 | ||
| 70 | 66 | ## Iniciación | |
| 71 | 67 | ||
| 72 | 68 | 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 | 69 | ||
| 74 | 70 | Cómo iniciar (Initialization) una librería dinámica: ToDo | |
| 75 | 71 | ||
| 76 | 72 | ## Finalización | |
| 77 | 73 | ||
| 78 | 74 | Cada unidad tiene una sección de finalización (Finalization). El orden de proceso es el inverso de la iniciación. | |
| 79 | 75 | ||
| 80 | 76 | ## Versiones, Distribución | |
| 81 | 77 | ||
| 82 | 78 | 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 | 79 | ||
| 84 | 80 | 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 | 81 | ||
| 86 | 82 | ToDo: propuesta sobre la forma en que el 'IDE' debe crear números de versión. | |
| 87 | 83 | ||
| 88 | 84 | ## Ver también | |
| 89 | 85 | ||
| 90 | 86 | - [[macOS Programming Tips|macOS Programming Tips - Libraries]] | |
| 91 | 87 | - [[macOS Dynamic Libraries]] | |
| 92 | 88 | - [[macOS Static Libraries]] | |
| 93 | 89 | - FPC [Librería compartida](http://wiki.lazarus.freepascal.org/shared_library/es) | |
| 94 | 90 | - FPC [paquetes](http://wiki.lazarus.freepascal.org/packages) | |
| 95 | 91 | ||
| 96 | 92 | --- | |
| 97 | 93 | *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).* |
