{"id":267,"date":"2014-04-14T14:59:22","date_gmt":"2014-04-14T14:59:22","guid":{"rendered":"https:\/\/blogs.ua.es\/jpm33\/?p=267"},"modified":"2014-04-14T17:11:03","modified_gmt":"2014-04-14T17:11:03","slug":"compilar-desde-linea-de-comnandos-en-windows-cli-usando-visual-c","status":"publish","type":"post","link":"https:\/\/blogs.ua.es\/jpm33\/2014\/04\/14\/compilar-desde-linea-de-comnandos-en-windows-cli-usando-visual-c\/","title":{"rendered":"Compilar desde l\u00ednea de comnandos en Windows (CLI) usando Visual C++"},"content":{"rendered":"<h1>Introducci\u00f3n<\/h1>\n<p>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\u00f3n hardware\/software entre Matlab, Modelsim y mis programas C debo usar ciertas bibliotecas est\u00e1ticas (lib) y generar biblotecas din\u00e1micas (dll) para comunicar los distintos procesos. Como estoy en Windows debo usar Microsft Visual Studio y Visual C++ <a href=\"#Referencias\">[1]<\/a>.<\/p>\n<p>En este caso no me sirve usar un compilador tan potente como GCC sobre MinGW porqu\u00e9 no soportar biblotecas tipo .lib ni generar .dll.<\/p>\n<p>Pero a\u00fan as\u00ed soy y ser\u00e9 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\u00f3n y necesite de verdad un gran IDE (como Eclipse o Visual Studio) no me gusta compilar un programa de apenas 800 l\u00edneas usando un IDE que genera una gran cantidad de ficheros y adem\u00e1s no me permite automatizar nada desde consola.<\/p>\n<p>Por ello he decidido investigar un poco y ver c\u00f3mo se compila un programa usando el compilador de C\/C++ de Microsft (cl.exe) en consola (cli). Adem\u00e1s de c\u00f3mo se enlazan todos los objetos usando el enlazador (linker) de Microsoft (link.exe).<\/p>\n<blockquote><p><strong>\u00a1Ojo!<\/strong> Depende de la versi\u00f3n de Visual Studio para poder compilar en consola se deber\u00e1 abrir la misma usando un enlace instalado por Visual Studio como \u00abVisual Studio Command Prompt (2010)\u00bb sino ciertas biblotecas y variables de entorno no estar\u00e1n configuradas correctamente.<\/p><\/blockquote>\n<h1>Makefile de ejemplo<\/h1>\n<p>A continuaci\u00f3n vemos un ejemplo de Makefile para compilar con cl.exe. Para descargar Make para windows v\u00e9ase el enlace <a href=\"#Referencias\">[2]<\/a> y para saber m\u00e1s sobre el funcionamiento de make <a href=\"#Referencias\">[3]<\/a>. Este makefile para generalizar el proceso y simplificarlo usa una regla basada en patrones (%.obj: %.c %.h):<\/p>\n<pre>#\r\n# Miscrosoft Visual Studio generic Makefile\r\n#\r\n\r\nRM=del \/q\r\nCC=cl\r\nCFLAGS=\/02\r\nLINKFLAGS=\r\nLINK=link\r\nOUTPUT=\/out:programa.exe\r\nOBJ=programa.obj lib.obj\r\nMAIN_TARGET=programa.exe\r\nINC_DIR=\r\n\r\n.phony: clean edit\r\n\r\nall: $(MAIN_TARGET)\r\n\r\n$(MAIN_TARGET): $(OBJ)\r\n\t$(LINK) $(LINKFLAGS) $(OBJ) $(OUTPUT)\r\n\r\n%.obj: %.c %.h\r\n\t$(CC) -c $(CFLAGS) $&lt;\r\n\r\nclean: \r\n\t$(RM) $(OBJ)<\/pre>\n<h1>Caso de ejemplo<\/h1>\n<p>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.<\/p>\n<p>Si ejecutamos el comando make:<\/p>\n<pre>C:\\ejemplos&gt;dir&gt;make\r\ncl -c libreria.c\r\nMicrosoft (R) 32-bit C\/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86\r\nCopyright (C) Microsoft Corporation.  All rights reserved.\r\n\r\nlibreria.c\r\ncl -c principal.c\r\nMicrosoft (R) 32-bit C\/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86\r\nCopyright (C) Microsoft Corporation.  All rights reserved.\r\n\r\nprincipal.c\r\nlink  libreria.obj principal.obj \/out:programa.exe\r\nMicrosoft (R) Incremental Linker Version 10.00.30319.01\r\nCopyright (C) Microsoft Corporation.  All rights reserved.<\/pre>\n<p>Generando el fichero ejecutable programa.exe, si vemos el contenido del directorio veremos los ficheros de c\u00f3digo fuente, los objetos, el ejecutable y el Makefile:<\/p>\n<pre>C:\\ejemplos&gt;dir\r\n El volumen de la unidad C no tiene etiqueta.\r\n El n\u00famero de serie del volumen es: xxx-yyyy\r\n\r\n Directorio de C:\\ejemplos&gt;\r\n\r\n05\/04\/2014  12:10              .\r\n05\/04\/2014  12:10              ..\r\n26\/03\/2014  17:59             1.433 libreria.c\r\n26\/03\/2014  17:59               216 libreria.h\r\n05\/04\/2014  12:10             1.540 libreria.obj\r\n05\/04\/2014  12:10               409 Makefile\r\n05\/04\/2014  11:01             8.800 principal.c\r\n05\/04\/2014  10:59             1.117 principal.h\r\n05\/04\/2014  12:10             9.565 principal.obj\r\n05\/04\/2014  12:10            90.624 programa.exe\r\n               8 archivos        113.704 bytes\r\n               2 dirs  41.752.834.048 bytes libres<\/pre>\n<p>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.<\/p>\n<p><a name=\"Referencias\"><\/a><\/p>\n<h1>Referencias<\/h1>\n<ol>\n<li><strong>Sitio oficial de Visual Studio<\/strong>: <a target=\"_blank\">http:\/\/msdn.microsoft.com\/en-US\/vstudio<\/a><\/li>\n<li><strong>Make para Windows<\/strong>: <a target=\"_blank\">http:\/\/gnuwin32.sourceforge.net\/packages\/make.htm<\/a><\/li>\n<li><strong>GNU Make<\/strong>: <a target=\"_blank\">https:\/\/www.gnu.org\/software\/make\/manual\/html_node\/<\/a><\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Introducci\u00f3n 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\u00f3n hardware\/software entre Matlab, Modelsim y mis programas C debo usar &hellip; <a href=\"https:\/\/blogs.ua.es\/jpm33\/2014\/04\/14\/compilar-desde-linea-de-comnandos-en-windows-cli-usando-visual-c\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":3080,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[676],"tags":[],"class_list":["post-267","post","type-post","status-publish","format-standard","hentry","category-sin-categoria"],"_links":{"self":[{"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/posts\/267","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/users\/3080"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/comments?post=267"}],"version-history":[{"count":8,"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/posts\/267\/revisions"}],"predecessor-version":[{"id":276,"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/posts\/267\/revisions\/276"}],"wp:attachment":[{"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/media?parent=267"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/categories?post=267"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/tags?post=267"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}