Usar ficheros incluidos con MySQL

Pero en realidad, aunque esto funcione, lo cierto es que junto con la instalación del servidor MySQL ya existen los ficheros de cabecera y las bibliotecas necesarias para usar MySQL en nuestros programas C/C++.

El método que vamos a explicar tiene la ventaja de que usaremos las bibliotecas adecuadas para la versión de MySQL que tenemos instalada. Si usamos el método del paquete de Dev-C++ probablemente estaremos usando bibliotecas de una versión anterior. Además, funciona con cualquier IDE que use como compilador MinGW, como por ejemplo, Code::Blocks.

Los ficheros de cabecera están en el directorio include dentro del directorio de instalación de MySQL, que dependerá de dónde lo hayas instalado. Esos ficheros pueden ser copiados al directorio a un directorio mysql dentro del directorio include de Dev-C++, o en su caso, en la carpeta include de MinGW.

Además, en el directorio lib\opt de MySQL existen varios ficheros de biblioteca, y una biblioteca de enlace dinámico libmysql.dll. Copiaremos esta biblioteca a un directorio donde sea accesible, por ejemplo al directorio system32 de Windows.

De los ficheros de bibliotecas estáticas sólo nos interesa uno: libmysql.lib.

Pero Mingw no puede usar esa biblioteca directamente. Este compilador usa otro formato de bibliotecas estáticas, que además de tener la extensión ".a", tienen un formato interno diferente. Deberemos, por lo tanto, convertir la biblioteca al formato adecuado.

Para poder hacerlo necesitamos los siguientes ficheros:

  • El fichero de biblioteca dinámica "dll": libmysql.dll.
  • El fichero de biblioteca estática "lib": libmysql.lib.
  • El fichero de definición de biblioteca "def": libmysql.def.

Y estas tres utilidades:

  • Utilidad reimp.exe.
  • Utilidad dlltool.exe.
  • Utilidad as.exe.

Los dos primeros ficheros ya los tenemos, los encontraremos en el directorio lib\opt de modo que para trabajar más fácilmente, los copiaremos a un directorio temporal de trabajo, por ejemplo, C:\mysqltmp\.

Para obtener el tercero necesitamos una utilidad de Mingw llamada reimp. Esta utilidad sirve para extraer ficheros de definición de bibliotecas "lib".

Para conseguir la herramienta reimp hay que descargar el fichero Utilidades mingw, que contiene algunas utilidades, pero del que sólo nos interesa el fichero reimp.exe.

Nota: por lo que he podido comprobar, las últimas versiones de MinGW incluyen el programa reimp.exe en la carpeta "bin". Por otra parte, las últimas versiones de MySQL, también contienen el fichero "libmysql.def" en la carpeta "include", pero no se puede utilizar porque el formato interno no es adecuado para nuestros propósitos.

Copiaremos el fichero reimp.exe al directorio de trabajo temporal, y ejecutamos esta sentencia desde la línea de comandos:

C:\mysqltmp> reimp -d libmysql.lib

Esto genera el fichero libmysql.def. El siguiente paso es crear el fichero de biblioteca estática libmysql.a. Para ello necesitamos las otras dos utilidades, dlltool.exe y as.exe que están incluidan con el compilador Mingw, y que podemos encontrar en el subdirectorio mingw32\bin del directorio donde esté instalado Dev-C++ o Code::Blocks. Para comodidad, copiaremos estas utilidades al directorio temporal de trabajo, y ejecutaremos la siguiente sentencia desde la línea de comandos:

C:\mysqltmp>dlltool -d libmysql.def -D libmysql.dll -k -l libmysql.a -S ./as.exe

La utilidad as.exe se invoca automáticamente desde dlltool. Ahora ya tenemos nuestro fichero de biblioteca estática libmysql.a, y lo copiaremos al directorio lib de Dev-C++.

Por último, podemos borrar el directorio de trabajo temporal. Y ya podemos usar bases de datos desde programas C/C++.

Este proceso es válido para convertir cualquier biblioteca en formato "lib" a su equivalente en formato "a".

Usar bibliotecas desde otros compiladores

No lo he verificado, pero es de suponer que otros compiladores usarán, o bien las bibliotecas estáticas con extensión "a" si se basan en Mingw, o las que tienen extensión "lib", como los compiladores de Borland o Microsoft.

En cualquier caso, si quieres compartir tus experiencias en estos compiladores con nosotros, podremos ampliar este apartado.