Introducción
Para mi tesis doctoral tengo que desarrollar una serie de programas escritos en C. Trabajo sobre Windows y uso el Matlab, Modelsim y Xilinx ISE. Para realizar una cosimulación hardware/software entre Matlab, Modelsim y mis programas C debo usar ciertas bibliotecas estáticas (lib) y generar biblotecas dinámicas (dll) para comunicar los distintos procesos. Como estoy en Windows debo usar Microsft Visual Studio y Visual C++ [1].
En este caso no me sirve usar un compilador tan potente como GCC sobre MinGW porqué no soportar biblotecas tipo .lib ni generar .dll.
Pero aún así soy y seré un enamorado de la consola, tanto en Windows y sobre todo en sistemas tipo Unix. Y desde luego a menos que desarrolle una gran aplicación y necesite de verdad un gran IDE (como Eclipse o Visual Studio) no me gusta compilar un programa de apenas 800 líneas usando un IDE que genera una gran cantidad de ficheros y además no me permite automatizar nada desde consola.
Por ello he decidido investigar un poco y ver cómo se compila un programa usando el compilador de C/C++ de Microsft (cl.exe) en consola (cli). Además de cómo se enlazan todos los objetos usando el enlazador (linker) de Microsoft (link.exe).
¡Ojo! Depende de la versión de Visual Studio para poder compilar en consola se deberá abrir la misma usando un enlace instalado por Visual Studio como “Visual Studio Command Prompt (2010)” sino ciertas biblotecas y variables de entorno no estarán configuradas correctamente.
Makefile de ejemplo
A continuación vemos un ejemplo de Makefile para compilar con cl.exe. Para descargar Make para windows véase el enlace [2] y para saber más sobre el funcionamiento de make [3]. Este makefile para generalizar el proceso y simplificarlo usa una regla basada en patrones (%.obj: %.c %.h):
# # Miscrosoft Visual Studio generic Makefile # RM=del /q CC=cl CFLAGS=/02 LINKFLAGS= LINK=link OUTPUT=/out:programa.exe OBJ=programa.obj lib.obj MAIN_TARGET=programa.exe INC_DIR= .phony: clean edit all: $(MAIN_TARGET) $(MAIN_TARGET): $(OBJ) $(LINK) $(LINKFLAGS) $(OBJ) $(OUTPUT) %.obj: %.c %.h $(CC) -c $(CFLAGS) $< clean: $(RM) $(OBJ)
Caso de ejemplo
Supongamos que tenemos los ficheros libreria.c, libreria.h y programa.h, libreria.c. La primera pareja contine algunas funciones de utileria y los dos segundos el grueso de nuestro programa.
Si ejecutamos el comando make:
C:\ejemplos>dir>make cl -c libreria.c Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. libreria.c cl -c principal.c Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. principal.c link libreria.obj principal.obj /out:programa.exe Microsoft (R) Incremental Linker Version 10.00.30319.01 Copyright (C) Microsoft Corporation. All rights reserved.
Generando el fichero ejecutable programa.exe, si vemos el contenido del directorio veremos los ficheros de código fuente, los objetos, el ejecutable y el Makefile:
C:\ejemplos>dir El volumen de la unidad C no tiene etiqueta. El número de serie del volumen es: xxx-yyyy Directorio de C:\ejemplos> 05/04/2014 12:10 . 05/04/2014 12:10 .. 26/03/2014 17:59 1.433 libreria.c 26/03/2014 17:59 216 libreria.h 05/04/2014 12:10 1.540 libreria.obj 05/04/2014 12:10 409 Makefile 05/04/2014 11:01 8.800 principal.c 05/04/2014 10:59 1.117 principal.h 05/04/2014 12:10 9.565 principal.obj 05/04/2014 12:10 90.624 programa.exe 8 archivos 113.704 bytes 2 dirs 41.752.834.048 bytes libres
De este modo hemos conseguido generar un sencillo ejecutable sin necesidad de abrir el IDE completo de Visual Studio y generar toda esa cantidad de ficheros basura inccesarios que generan los proyectos y soluciones de Microsoft Viusal Studio.
Referencias
- Sitio oficial de Visual Studio: http://msdn.microsoft.com/en-US/vstudio
- Make para Windows: http://gnuwin32.sourceforge.net/packages/make.htm
- GNU Make: https://www.gnu.org/software/make/manual/html_node/