NovaMonoFix
Errores PHP
X
Usuario
Password
0 FPS

Generar un .lib a partir de una DLL con Visual Studio

12 de Octubre del 2011 por Josep Antoni Bover, 17 visitas, 0 comentarios, 0 votos
Categorías : Windows, Programación, C y C++.
La web está en segundo plano, animación en pausa.
Cargando animación...
Generar un .lib a partir de una DLL con Visual Studio

Hoy vamos a ver cómo podemos generar un archivo lib utilizando de base una DLL.

Aunque no es un problema muy común, puede darse el caso de que necesitemos trabajar con cierta dll bajo VisualC, y que dicha dll no tenga un archivo lib desde el que poder linkear, pero si disponga de las cabeceras con las declaraciones para la dll.

Un ejemplo muy claro seria la LibVLC que es la librería base para el famoso reproductor de medios VLC.

Lo primero que necesitamos es una versión cualquiera de Visual Studio a partir de la 2003, en el caso de no tener ninguna podéis descargar la versión gratuita desde el siguiente enlace : Visual Studio Express.

Visual Studio trae consigo un montón de herramientas, entre ellas existe una aplicación de consola denominada dumpbin.exe que nos permite examinar la información de archivos binarios en formato Common Object File Format (COFF). A primera vista esto puede sonar a chino, pero en esencia nos permite ver entre otras cosas las declaraciones de las que dispone una DLL.

Pongamos por ejemplo que queremos generar el archivo libvlc.lib a partir del archivo libvlc.dll, para hacerlo lo primero que debemos hacer es abrir el "Símbolo del sistema de Visual Studio" que podéis encontrar dentro del "Menú de inicio" -> "Visual Studio" -> "Visual Studio Tools".

Una vez abierto no es más que una consola de comandos normal y corriente, pero que tiene cargadas las variables de entorno necesarias para ejecutar cualquier herramienta de Visual Studio desde ella.

En primer lugar nos movemos a la carpeta donde se encuentra la libvlc.dll, en mi caso "C:\Program Files (x86)\VideoLAN\VLC"

Para sistemas operativos Vista o superiores vamos a necesitar una carpeta donde no se requieran permisos de administrador para escribir, que en mi caso será "D:\Programacio".

Simbolo del sistema de Visual Studio

Una vez en el directorio ejecutamos el siguiente comando :

Comando
1
dumpbin /exports libvlc.dll > D:\Programacio\libvlc.def

Si el comando se ha ejecutado correctamente no saldrá nada, y nos devolverá al símbolo del sistema. En caso de que no se pueda escribir el archivo en la ruta especificada nos saldrá el mensaje "Acceso denegado", esto es porque muy probablemente el directorio donde queremos escribir el archivo libvlc.def requiere privilegios de administración para poder escribir datos en el.

Una vez creado el archivo libvlc.def vamos a editarlo utilizando el notepad mismo. Al editarlo deberíamos ver algo como la siguiente foto :

Notepad libvlc.def

Para que sea un archivo .def válido, en la primera línea debería poner EXPORTS, y luego debería haber un nombre de función por línea.

De todo lo que vemos solo nos sirve la parte marcada en rojo, que son los nombres de las funciones que exporta la libvlc.dll, por lo que tenemos que eliminar el resto de información.

Para eliminar la información o bien lo hacemos a mano (ojo que son 230 funciones) o podemos utilizar los siguientes comandos :

Comando
1
2
echo EXPORTS > D:\Programacio\libvlc.def
for /f "usebackq tokens=4,* delims=_ " %%i in (`dumpbin /exports libvlc.dll`) do if %%i==libvlc echo %%i_%%j >> D:\Programacio\libvlc.def
Las variables van con un '%' desde la linea de comandos, pero desde dentro de un archivo bat van con 2 '%%'.

Una vez tengamos el archivo de definiciones preparado nos queda crear el .lib con el siguiente comando :

Comando
1
lib /def:"D:\Programacio\libvlc.def" /out:"D:\Programacio\libvlc.lib" /machine:x86

Generando libvlc.lib

En este caso la dll es de 32 bits (de momento solo hay versiones de 32bits del VLC para windows) por lo que ponemos "/machine:x86" en caso de ser una dll de 64 bits deberíamos poner "/machine:x64".

Y esto es todo, ya tenemos nuestro .lib creado y ya podemos utilizarlo para linkear nuestro código con la dll. Espero que os sirva de ayuda.