Carga de librerías
Funciones
DLib* | dlib_open (...) |
void | dlib_close (...) |
type | dlib_proc (...) |
type* | dlib_var (...) |
La habitual, en proyectos de relativo tamaño, es dividir el código del programa en librerías con el fin de poder reutilizarlas en diferentes proyectos. El enlace de estas librerías dentro del ejecutable final puede realizarse de tres formas:
- Tiempo de compilación: El código de la librería se copia dentro del ejecutable, formando parte de inseparable del mismo (librerías estáticas) (Figura 1) (a).
- Tiempo de carga: El código de la librería se distribuye por separado (librerías dinámicas) y se carga junto con el programa principal, al mismo tiempo (Figura 1) (b).
- Tiempo de ejecución: Librerías dinámicas que el programa carga en el momento que las necesita (Figura 1) (c).
El proceso de enlace es relativamente complicado y se gestiona automáticamente mediante el compilador y el cargador del sistema operativo. El programador solo debe intervenir en el tercer caso, ya que es necesario incluir código para cargar las librerías y acceder a los métodos o variables oportunos en cada momento.
- Utiliza dlib_open para cargar una librería en tiempo de ejecución.
- Utiliza dlib_proc para obtener un puntero a una función de la librería.
- Utiliza dlib_var para obtener un puntero a una variable de la librería.
1. Rutas de búsqueda de librerías
Una librería dinámica se encuentra en un archivo diferente al de los ejecutables que pueden hacer uso de ella. Cada sistema operativo implementa diferentes estrategias de búsqueda que debemos conocer para instalar y/o configurar los programas de la forma correcta.
1.1. Orden de búsqueda en Windows
- El directorio
path
de dlib_open. - El mismo directorio que el ejecutable.
- El directorio actual bfile_dir_work.
- El directorio
%SystemRoot%\System32
. - El directorio
%SystemRoot%
. - Los directorios especificados en la variable de entorno
PATH
.
1.2. Orden de búsqueda en Linux/macOS
- Los directorios especificados en la variable de entorno
LD_LIBRARY_PATH
(Linux) oDYLD_LIBRARY_PATH
(macOS). - Los directorios especificados en el ejecutable
rpath
. - Los directorios del sistema
/lib, /usr/lib, etc
.
dlib_open ()
Carga una librería dinámica en tiempo de ejecución.
DLib* dlib_open(const char_t *path, const char_t *libname);
1 2 3 4 |
path | Directorio donde se encuentra la librería. Puede ser |
libname | Nombre de la librería. Debe ser el nombre "plano" sin prefijos, sufijos o extensiones propias de cada sistema operativo. |
Retorna
Puntero a la librería o NULL
si no ha podido cargarla.
Observaciones
Si path
es NULL
se seguirá la estrategia de búsqueda de librerías de cada sistema operativo. Ver Rutas de búsqueda de librerías.
dlib_close ()
Cierra una librería previamente abierta con dlib_open.
void dlib_close(DLib **dlib);
dlib | Puntero a la librería. Será puesto a |
dlib_proc ()
Obtiene un puntero a un método de la librería.
type dlib_proc(DLib *lib, const char_t *procname, type);
1 2 3 |
lib | Librería. |
procname | Nombre del método. |
type | Tipo del método. Necesario para hacer la conversión desde un puntero genérico. |
Retorna
Puntero al método.
dlib_var ()
Obtiene un puntero a una variable de la librería.
type* dlib_var(DLib *lib, const char_t *varname, type);
lib | Librería. |
varname | Nombre de la variable. |
type | Tipo de la variable. |
Retorna
Puntero a la variable.