SDK Multiplataforma en C logo

SDK Multiplataforma en C

Carga de librerías

❮ Anterior
Siguiente ❯

Funciones

DLib*dlib_open (...)
voiddlib_close (...)
typedlib_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).
  • Esquema de un ejecutable enlazando con una librería.
    Figura 1: Enlace de librerías y carga dinámica.

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) o DYLD_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
DLib *lib = dlib_open(NULL, "myplugin");
// myplugin.dll         In Windows
// libmyplugin.so       In Linux
// libmyplugin.dylib    In macOS
path

Directorio donde se encuentra la librería. Puede ser NULL.

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 NULL tras la destrucción.


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
typedef uint32_t(*FPtr_add)(const uint32_t, const uint32_t);
FPtr_add func_add = dlib_proc(lib, "plugin_add", FPtr_add);
uint32_t ret = func_add(67, 44);
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);
1
const V2Df *vzero = dlib_var(lib, "kV2D_ZEROf", V2Df);
lib

Librería.

varname

Nombre de la variable.

type

Tipo de la variable.

Retorna

Puntero a la variable.

❮ Anterior
Siguiente ❯