{"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 &#8220;Visual Studio Command Prompt (2010)&#8221; 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}]}}