Compilar desde línea de comnandos en Windows (CLI) usando Visual C++

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

  1. Sitio oficial de Visual Studio: http://msdn.microsoft.com/en-US/vstudio
  2. Make para Windows: http://gnuwin32.sourceforge.net/packages/make.htm
  3. GNU Make: https://www.gnu.org/software/make/manual/html_node/