Difference between revisions of "Lazarus/FPC Libraries/es"

From Lazarus wiki
Jump to navigationJump to search
(→‎Ver también: Add entries)
 
(33 intermediate revisions by 4 users not shown)
Line 1: Line 1:
 
{{Lazarus/FPC Libraries}}
 
{{Lazarus/FPC Libraries}}
 +
<!--- [[category:Español|L]][[category:Castellano|L]] --->
  
Esta página describe las posibilidades  de creación de librerias con Lazarus/FPC y cómo usarlas en proyectos y paquetes.
+
&nbsp;&nbsp;&nbsp;Esta página describe las posibilidades  de creación de librerías con Lazarus/FPC y cómo usarlas en proyectos y paquetes.
  
 
==Tópicos relacionados==
 
==Tópicos relacionados==
  
*[[Creando vínculos/enlaces para librerías C]] - Cómo  convertir un fichero de cabecera C (.h) en una unidad pascal
+
*[http://wiki.lazarus.freepascal.org/Creating_bindings_for_C_libraries 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==
 
==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)  
+
&nbsp;&nbsp;&nbsp;'''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".
+
&nbsp;&nbsp;&nbsp;'''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.
+
&nbsp;&nbsp;&nbsp;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==
 
==Sistemas Operativos==
  
Librerías dinámicas:
+
Librerías dinámicas:<center>
{| BORDER="1" CELLSPACING="0"
+
{| class="wikitable"
!COLSPAN="1" STYLE="background:#ffdead;"|'''Sistema Operativo'''
+
! '''Sistema Operativo''' !! '''Librería dinámica''' !! '''Librería estática''' || '''Prefijo de la Librería
!COLSPAN="1" STYLE="background:#ffdead;"|'''Librería dinámica'''
 
!COLSPAN="1" STYLE="background:#ffdead;"|'''Librería estática'''
 
 
|---- class="working"
 
|---- class="working"
|FreeBSD||.so||.a
+
|FreeBSD||.so||.a || lib
 
|---- class="working"
 
|---- class="working"
|MacOSX||.dylib||?
+
|macOS||.dylib||.a || lib
 
|---- class="working"
 
|---- class="working"
|Linux||.so||.a
+
|Linux||.so||.a || lib
 
|---- class="working"
 
|---- class="working"
|Windows||.dll||.lib
+
|Windows||.dll||.lib || -
|}
+
|---- class="working"
 +
|Haiku|| .so || .a || lib
 +
|}</center>
  
===FreeBSD===
+
===FreeBSD, MacOSX y Linux===
  
===MacOSX===
+
&nbsp;&nbsp;&nbsp;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===
+
&nbsp;&nbsp;&nbsp;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.
  
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.
+
&nbsp;&nbsp;&nbsp;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é.
  
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.
+
&nbsp;&nbsp;&nbsp;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.
 
 
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===
  
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.
+
&nbsp;&nbsp;&nbsp;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.
  
 
==ppumove, .ppu, .ppl==
 
==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.
+
&nbsp;&nbsp;&nbsp;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: '''.dll''') y elimina las referencias a los ficheros .o de los ficheros .ppu. Estos nuevos ficheros .ppu son normalmente nombrados como '''.ppl'''.
+
&nbsp;&nbsp;&nbsp;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:
+
&nbsp;&nbsp;&nbsp;Por ejemplo:
  
Estando en el directorio de salida de un paquete (donde está el fichero .ppu):
+
&nbsp;&nbsp;&nbsp;Estando en el directorio de salida de un paquete (donde está el fichero .ppu):
  
 
   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: packagename.dll). Note that under Linux the prefix 'lib' is always prepended.
+
&nbsp;&nbsp;&nbsp;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.
 +
 
 +
&nbsp;&nbsp;&nbsp;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(¡?).
  
This new library can already be used by other programming languages like C. Or by FPC programs by using the '''external''' modifiers. 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.
+
==Cargando la librería dinámica==
  
==dlopen - loading a dynamic library==
+
&nbsp;&nbsp;&nbsp;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.
  
Loading a dynamic library is simple with the '''dlopen''' function of the '''unit dl'''.
+
  LibDir := Loadlibrary( 'ruta a la librería/libNOMBRELIBERIA.so', 1 ); //(Linux)
 +
  Asa := LoadLibrary('modulo.DLL');                              //(windows)
  
ToDo: give an example
+
&nbsp;&nbsp;&nbsp;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.
  
The main problem is to get the filename, which depends on the version and the operating system.
+
&nbsp;&nbsp;&nbsp;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.
  
==Initialization==
+
==Iniciación==
  
Every unit can contain an initialization section. The order of the initialization sections depend on the uses sections of each unit.
+
&nbsp;&nbsp;&nbsp;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.
  
How to initialize a dynamic library: ToDo
+
&nbsp;&nbsp;&nbsp;Cómo iniciar (Initialization) una librería dinámica: ToDo
  
==Finalization==
+
==Finalización==
  
Every unit can contain an finalization section. The order is the reverse order of the initialization sections.
+
&nbsp;&nbsp;&nbsp;Cada unidad tiene una sección de finalización (Finalization). El orden de proceso es el inverso de la iniciación.
  
==Versions, Distribution==
+
==Versiones, Distribución==
  
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.
+
&nbsp;&nbsp;&nbsp;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.
  
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.
+
&nbsp;&nbsp;&nbsp;Para cargar una librería dinámica hay que conocer su nombre correcto. En Linux esto significa, conocer el número de versión.
  
ToDo: proposal how the IDE should create version numbers
+
&nbsp;&nbsp;&nbsp;ToDo: propuesta sobre la forma en que el 'IDE' debe crear números de versión.
  
==See Also==
+
==Ver también==
* FPC [[shared library]]
+
* [[macOS Programming Tips#Libraries|macOS Programming Tips - Libraries]]
* FPC [[packages]]
+
* [[macOS Dynamic Libraries]]
 +
* [[macOS Static Libraries]]
 +
* FPC [http://wiki.lazarus.freepascal.org/shared_library/es Librería compartida]
 +
* FPC [http://wiki.lazarus.freepascal.org/packages paquetes]

Latest revision as of 00:59, 24 September 2021

English (en) español (es) français (fr) 日本語 (ja) русский (ru)

   Esta página describe las posibilidades de creación de librerías con Lazarus/FPC y cómo usarlas en proyectos y paquetes.

Tópicos relacionados

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 Prefijo de la Librería
FreeBSD .so .a lib
macOS .dylib .a lib
Linux .so .a lib
Windows .dll .lib -
Haiku .so .a lib

FreeBSD, MacOSX y 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.

   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é.

   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.

Windows

   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.

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. 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(¡?).

Cargando la librería dinámica

   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.

  LibDir := Loadlibrary( 'ruta a la librería/libNOMBRELIBERIA.so', 1 ); //(Linux)
  Asa := LoadLibrary('modulo.DLL');                              //(windows) 

   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.

   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.

Iniciación

   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.

   Cómo iniciar (Initialization) una librería dinámica: ToDo

Finalización

   Cada unidad tiene una sección de finalización (Finalization). El orden de proceso es el inverso de la iniciación.

Versiones, Distribución

   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.

   Para cargar una librería dinámica hay que conocer su nombre correcto. En Linux esto significa, conocer el número de versión.

   ToDo: propuesta sobre la forma en que el 'IDE' debe crear números de versión.

Ver también