En este tutorial aprenderás a importar una librería dll a tu proyecto en Visual Studio de forma estática.

¿Qué necesitas tener?

  1. Visual Studio. Preferiblemente la última versión.
  2. Visual C++. A menudo incluido en Visual Studio. Instalar desde este IDE si no se encuentra.
  3. Cliente Git, para poder descargar mis proyectos de GitHub. Descarga: GitHub desktop
  4. Proyecto DummyTest: DummyTest

¿Qué necesitas saber?

  1. Conocimientos básicos de C++. Un buen tutorial: cplusplus
  2. Creación de un proyecto de tipo “aplicación de consola Win32”. Tuto oficial: microsoft
  3. Conocimientos de control de versiones, en este caso Git. Tutorial oficial: Git

Al grano

Paso 1: Archivos de inclusión adicionales

Captura

Nos servirá para que Visual Studio sepa donde buscar cuando usemos la directiva:

#include [nombre de cabecera].h

en nuestro código.

  • En Visual Studio creamos un proyecto de consola en Win32.
  • Una vez creado, botón derecho sobre el proyecto (ojo, no la solución), propiedades.
  • En la lista de la izquierda, desplegamos C/C++ y elegimos General.
  • En el área central aparece una lista de opciones, en el área de texto junto a la opción “directorios de inclusión adicionales” escribimos la ruta que nos lleva hasta los archivos .h, es decir:

    [C:\…]\DummyTest\include

Paso 2: Directorios de bibliotecas adicionales.

Captura2

Captura3

Con esto le decimos Visual Studio dónde buscar nuestra librería .lib

  • En la misma configuración, desplegamos la lista llamada “Vinculador”. Seleccionamos “General”.
  • En la lista de opciones, buscamos “Directorios de bibliotecas adicionales”, y en el área de texto junto a ella, escribimos la ruta que lo llevará hacia el archivo .lib, en este caso:

    [C:\…]\DummyTest\lib

  • En la pestaña “Entrada” (justo debajo de “General”), buscamos la opción “Dependencias adicionales”, en ella escribimos el nombre del archivo .lib, en este caso DummyTest.lib. Con esto decimos a Visual Studio: “de todos los posibles archivos .lib que haya en la dirección [C:\…]\DummyTest\lib, quiero importar DummyTest.lib“. A partir de este punto, cuando cerramos la ventana de propiedades, nuestro proyecto depende de la DLL, por lo que de no estar presente, obtendremos un error del Linker.

Paso 3: Añadir el archivo .dll a la raíz donde se encuentra nuestro ejecutable.

Esto puede ser algo confuso, pues mientras el proyecto esté en desarrollo, el archivo .dll debe encontrarse en la raíz del proyecto de Visual Studio, es decir en:

[C:\…]\[nombre de la solución]\[nombre del proyecto]

Solo tienes que copiar el archivo .dll y pegarlo en esta ruta. Cuando saques la aplicación (y tengas tu flamante .exe), el archivo .dll deberá estar en el mismo directorio que tu ejecutable.

Código

En nuestro proyecto de prueba, creamos un documento .cpp e incluimos el siguiente código:

/*incluimos el archivo de encabezado a nuestro documento. 
Échale un vistazo al archivo DummyTest.h para ver qué elementos contiene para su uso.*/
#include <DummyTest.h>

int main()
{
	//Función solitaria cargada de la DLL. Imprime en consola: "funcion cargada correctamente"
	DummyTest_imprime();

	//clase cargada de la DLL. Imprime en consola: "clase cargada correctamente"
	DummyTest_class my_class;
	my_class.DummyTest_imprime_desde_clase();

	//escribimos esto para evitar que la ventana de consola se cierre al instante en cuanto se ejecute
	getchar();

	//Devolvemos 0 para indicar que se ha salido de la aplicación sin problemas.
    return 0;
}

Teoría

El tutorial trata de explicar el proceso de incluir una librería dinámica (dll) que ya está precompilada a nuestro proyecto. La finalidad de estas librerías es añadir funcionalidad a nuestros proyectos sin necesidad de incluir dichas funciones en nuestro archivo ejecutable. Esto implica que junto con nuestro .exe debemos incluir el archivo .dll que corresponda. Cuando descargamos una librería de internet que nos facilita alguna tarea (algo que a menudo haré en los próximos tutoriales), podemos encontrarla en varios estados, siendo el más simple de usar la librería precompilada. Esto significa que ya se encuentra lista para usar sin necesidad de que nosotros tengamos que compilarla. Lo único que tenemos que hacer es configurar nuestro proyecto para admitir la librería y acceder a sus funciones y clases. La ventaja es su sencillez en el número de pasos que hay que hacer para tenerlo todo listo. Su desventaja principal es que si descargamos una DLL precompilada, luego no podremos portar nuestra aplicación a otro sistema operativo que no sea Windows. Existen otras desventajas, como que si la librería se compiló con una versión de VC++ (compilador de Visual Studio) distinta a la que estamos usando con nuestro proyecto, podríamos tener problemas de compatibilidad.

Pero no hay que desanimarse, así que nos quedaremos con la parte positiva de esto: su sencillez. En mi caso, crearé una librería dummy y la compilaré con el VC++ incluido en Visual Studio 15. Además, lo compilaré para máquinas x86. El formato del proyecto es el más típico, el cual contiene 3 carpetas: bin, include y lib. Bin contiene un archivo .dll en el que están implementadas todas las funciones que nos interesan, es decir, es la parte que realmente andamos buscando. Include contiene los archivos de encabezado .h que nos permite identificar y usar en nuestro código las funciones contenidas en la DLL. ¿Cómo sabrías qué funciones contiene la DLL (nombre, parámetros de entrada) sin estos archivos? (Existen formas, pero no entraremos en eso). Por último está la carpeta lib, la cual contiene un archivo con el mismo nombre que la DLL, pero con la extensión .lib. Esta librería se usa para hacer cargas estáticas de las DLL, es decir, que tu proyecto necesita esa DLL para poder funcionar, por tanto, tu ejecutable declara previamente en tiempo de compilación que la necesita. Si esta no estuviera presente junto a tu ejecutable, probablemente obtendrás un error. Básicamente el archivo .lib “da fe” del contenido de la DLL, de manera que nuestro proyecto no se quejará porque falten las implementaciones de las funciones de la DLL (recordamos que la DLL siempre se encuentra fuera de nuestro ejecutable, y los archivos .h solo declaran las funciones, no las implementan).

Deja un comentario

Tu email no será publicado. Campos obligatorios marcados con *