Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Introducción a la compilación en ambientes Unix.

781 views

Published on

Pequeña introducción a la compilación de programas en entornos Unix.

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Introducción a la compilación en ambientes Unix.

  1. 1. Introducci´n a la compilaci´n en ambiente Unix o o Luis C. P´rez Tato e 27 de julio de 2012´Indice 1. Introducci´n o Este art´ıculo se redacta pensando en aque-1. Introducci´n o 1 llas personas que tienen conocimientos de in- 1.1. ¿Porqu´ tengo que compilar el e form´tica a nivel de usuario y desean aprender a programa? . . . . . . . . . . . . . 1 a compilar e instalar programas que se distri- buyen en forma de c´digo fuente. En particular o2. Compilaci´n o 2 se pretende facilitar la instalaci´n del programa o 2.1. Estructura del c´digo fuente . . . o 2 Xc1 . 2.2. Bibliotecas de funciones . . . . . 3 Con ese fin se introducen algunos conceptos 2.2.1. Ejemplo de funci´n de bi- o b´sicos acerca de la generaci´n de c´digo eje- a o o blioteca . . . . . . . . . . 4 cutable para, posteriormente, explicar c´mo se o 2.3. Problemas que pueden presen- resuelven los problemas m´s frecuentes a la ho- a tarse al compilar el programa . . 4 ra de compilar un programa en un ambiente 2.3.1. Archivos de cabecera . . . 4 ligeramente diferente al de la m´quina en que a 2.3.2. No se encuentra un archi- se cre´. o vo de cabecera . . . . . . 5 Aunque frecuentemente se emplea la palabra3. Enlace 6 compilar para referirse a la obtenci´n de un o 3.1. Problemas que pueden presen- programa ejecutable a partir del c´digo fuente o tarse al enlazar el programa . . . 6 del mismo, en realidad dicho proceso requiere 3.1.1. Archivos de biblioteca . . 6 realizar dos operaciones: compilaci´n y enlace. o 3.1.2. No se encuentra la defini- M´s adelante se explica brevemente en qu´ con- a e ci´n de una funci´n . . . o o 6 sisten estas operaciones. 3.1.3. No se encuentra un archi- En las p´ginas siguientes se intentar´ trans- a a vo de biblioteca . . . . . . 6 mitir al lector los conocimientos b´sicos necesa- a rios que le permitan iniciarse en el uso de pro-4. La herramienta «Make» 7 gramas distribuidos en forma de c´digo fuente. o5. Sistemas de compilaci´n integra- o dos (CMake,. . . ) 7 1.1. ¿Porqu´ tengo que compilar e 5.1. Empleo de CMake . . . . . . . . 7 el programa? 5.2. Autoconf . . . . . . . . . . . . . 7 Puede que uno se pregunte acerca de la nece- sidad de compilar el programa en lugar de em-6. Las instrucciones de compilaci´n o 7 plear un c´modo programa de instalaci´n que o o7. Conclusi´n o 7 oculte al usuario la complejidad del proceso de generar c´digo ejecutable para una m´quina de- o a terminada. Cuando un programa est´ dise˜ado para eje- a n cutarse en un s´lo sistema operativo que co- o 1 Xc es un programa de an´lisis de estructuras me- a diante elementos finitos de c´digo abierto o 1
  2. 2. www.xcingenieria.com ´ Pagina: 2 de 10 T´ ıtulo: Compilar un programa. . . . Fecha: 27 de julio de 2012 Apartado: 2 COMPILACION ´ ´ Revision: 0rre sobre un s´lo tipo de m´quina (por ejemplo o a 2. Compilaci´n oOS X y Mac) es relativamente sencillo generarun ejecutable v´lido para dichas m´quinas y un a a Compilar, en nuestro contexto, consiste enprograma de instalaci´n que se encargue de co- o «traducir» el c´digo fuente escrito en un len- olocar el archivo ejecutable y otros archivos que guaje de alto nivel (C, C++, Fortran,. . . ) a unasean necesarios para la ejecuci´n, en los lugares o secuencia de instrucciones directamente inter-adecuados. pretable por el procesador (Intel, Sparc, Moto- Sin embargo, si lo que se pretende es que el rola,. . . ) (lenguaje de m´quina). aprograma se pueda instalar en una familia de Para hacerse una idea de qu´ aspecto tiene el em´quinas tan amplia como sea posible la solu- a lenguaje de m´quina puede examinarse la figura aci´n anterior no resulta tan sencilla de aplicar. o 1.El problema radica en la variedad de arquitec-turas para las que hay que resolver la instala-ci´n. Por ejemplo considerando s´lo las arqui- o o 2.1. Estructura del c´digo fuente otecturas de hardware m´s populares tendremos: a El c´digo fuente de un programa estar´ for- o a mado por el del programa principal y las bi- Intel IA-32. bliotecas de funciones que acompa˜an a ´ste. n e Para dar una idea de en qu´ consiste esto en e Intel IA-64. los p´rrafos siguientes se desarrolla un ejemplo a que, aun siendo trivial, contiene los elementos AMD64. b´sicos que forman el problema. Por otra parte a en la figura 2 se intentan representar las relacio- Por otra parte sobre esa arquitectura podr´ ıa- nes de dependencia del programa con el sistemamos encontrar distintas distribuciones de Linux operativo y el hardware en el que se pretende(Ubuntu, Linux Mint, Debian, Red Hat, Suse, ejecutar.Fedora,. . . ) u otros sistemas de similares carac- Supongamos que tenemos un archivo de nom-ter´ısticas HP-UX, IBM-AIX, Solaris, etc´tera. bre hola.cc con el siguiente contenido: e El coste de elaborar soluciones para la ins-talaci´n, aunque s´lo fuera para unas pocas de #include <i o s t r e a m > o o i n t main ( )entre las combinaciones posibles, es muy gran- {de2 . s t d : : c o u t << ”Hola a t o d o s . ” Si en lugar de ello lo que se hace es distri- << s t d : : e n d l ;buir el c´digo fuente y dejar al usuario la tarea o return 0 ;de compilarlo el problema se simplifica bastan- }te y la tarea que se traslada al usuario no esdemasiado complicada en la mayor parte de los como el nombre del archivo lleva la extensi´n ocasos 3 «cc» suponemos que se trata de un programa Como puede ver el argumento es muy similar escrito en C++ (si estuviera escrito en FOR-a los que emplea una conocida cadena de dis- TRAN deber´ llevar la extensi´n «for», en ıa otribuci´n de muebles para justificar que sea el o Python la extensi´n «py»,. . . ). Por otra par- ocliente el que tenga que transportarlos hasta su te como en el programa se define la funci´n ocasa y montarlos. «main» sabemos que el archivo corresponde al programa principal ya que en C++ (y en C) la 2 Las distintas distribuciones de Linux resuelven es- funci´n que se ejecuta al lanzar la ejecuci´n del o ote problema empleando a personas (los denominados programa es precisamente ´sta. e«package maintainers») que se dedican a adaptar un Si examinamos la primera l´ ınea del c´digo en oprograma determinado (como por ejemplo Gimp www.gimp.org) a la distribuci´n en cuesti´n. o o la que se lee #include <iostream> deducimos 3 La tarea ser´ tanto m´s complicada cuanto m´s di- a a a que el programa emplea el archivo de cabece-ferente sea la m´quina en la que se pretende compilar ra denominado «iostream» y, con un poco de ael programa de aquella en la que se cre´ el mismo. Por o esfuerzo se puede averiguar (aunque en generalejemplo si se intenta compilar un programa dise˜ ado npara Unix en una m´quina Windows el dolor de cabeza no ser´ necesario) que en un sistema Debian Li- a aest´ pr´cticamente garantizado. a a nux versi´n 6 esto implica usar la biblioteca de o
  3. 3. www.xcingenieria.com ´ Pagina: 3 de 10 T´ ıtulo: Compilar un programa. . . . Fecha: 27 de julio de 2012 Apartado: 2 COMPILACION ´ ´ Revision: 0funciones «LibCXX 3.4» que forma parte del Ahora el proceso para generar el ejecutablesistema operativo. un poco m´s complicado. Primero deberemos a As´ que el programa hola.cc est´ formado ı a compilar la biblioteca de funciones. Para ellopor un unico archivo y (en mi sistema) s´lo usa ´ o teclear´ ıamos:la biblioteca de funciones LibCXX versi´n 3.4. oSi el lector usa alguna variante de Unix y quiere g++ -c bibHola.cc -o bibHola.ocompilar este programa, con el compilador deGNU, puede hacerlo mediante: y a continuaci´n generaremos el ejecutable me- o diante:g++ hola.cc -o hola Para ilustrar el caso general, en el que el pro- g++ bibHola.o hola.cc -o holagrama a compilar emplea bibliotecas de fun-ciones cuyo c´digo fuente se suministra con el o El ejemplo descrito hasta aqu´ a pesar de su ı,mismo, escribiremos el archivo bibHola.h que simplicidad, ilustra las principales tareas quecontendr´ lo siguiente: a deben realizarse para compilar cualquier pro- grama. En los apartados siguientes se desarro-// b i b H o l a . h llan un poco m´s algunos aspectos de lo tratado a#i f n d e f BIBHOLA H aqu´ de forma tan superficial. ı#define BIBHOLA H 2.2. Bibliotecas de funciones#include <s t r i n g > Un microprocesador es capaz, por s´ solo, de ıvoid p r i n t m s g ( const s t d : : s t r i n g &msg ) ;ejecutar instrucciones sencillas como la suma, resta y producto de n´meros. Tambi´n existen u e#endif microprocesadores que incorporan rutinas pa- Este ser´ el archivo de cabecera de nuestra a ra procesar operaciones no tan sencillas comobiblioteca en el que se declara una sola funci´n o evaluar funciones trigonom´tricas4 , logaritmos, ea la que hemos llamado pring_msg. etc´tera. e La implementaci´n de la funci´n la escri- o o El resto de las operaciones que realiza un pro-biremos en un archivo al que llamaremos grama (mostrar texto y figuras en un monitor,bibHola.cc y aqu´ definiremos lo que hace la ı leer y escribir en discos duros, memorias USBfunci´n: o y perif´ricos de todo tipo,. . . ) se realizan con el e// b i b H o l a . cc auxilio de lo que llamamos funciones de biblio- teca. Ese es el motivo de que cuando se adquiere#include ”b i b Ho l a . h ” un elemento de hardware nuevo (tarjeta de v´ ı-#include <i o s t r e a m > deo, esc´ner,. . . ) venga acompa˜ado de un dis- a n co con sus «drivers», es decir, con las funcionesvoid p r i n t m s g ( const s t d : : s t r i n g &msg ) de biblioteca que permitir´n al sistema opera- a { tivo de la m´quina y a otras aplicaciones mane- a s t d : : c o u t << msg << s t d : : e n d l ; jar el dispositivo (mostrar gr´ficos 3D, escanear a } documentos,. . . ). Por ultimo modificaremos el contenido del ar- ´ Estas funciones de biblioteca no son m´s que achivo hola.cc como sigue: secuencias de instrucciones b´sicas que sirven a#include ”b i b Ho l a . h ” para facilitar la ejecuci´n de una operaci´n re- o oin t main ( void ) lativamente compleja (por ejemplo calcular el { determinante de una matriz), o acceder a de- p r i n t m s g ( ”Hola a t o d o s . ” ) ; terminada caracter´ ıstica de determinado hard- return 0 ; ware (por ejemplo borrar lo que se muestra en } pantalla). Ahora el programa principal usa la funci´n o 4A los usuarios m´s veteranos de ordenadores de ti- apring_msg de nuestra raqu´ıtica biblioteca de po PC les resultar´ familiar el t´rmino «coprocesador a efunciones «bibHola». matem´tico» que populariz´ Intel en los a˜os 80. a o n
  4. 4. www.xcingenieria.com ´ Pagina: 4 de 10 T´ ıtulo: Compilar un programa. . . . Fecha: 27 de julio de 2012 Apartado: 2 COMPILACION ´ ´ Revision: 02.2.1. Ejemplo de funci´n de biblioteca o OS, y .obj en los sistemas operativos de Mi- crosoft7 . Para dar una idea un poco m´s aproximada ade lo que se intenta describir en este apartadopondremos un ejemplo trivial. 2.3. Problemas que pueden pre- Supongamos una funci´n que se encarga de o sentarse al compilar el pro-cambiar el color de un p´ en la pantalla. Es- ıxel gramata funci´n podr´ recibir como argumentos las o ıa En lo que sigue se supone que tratamos decoordenadas x e y del p´ ıxel en cuesti´n y los o 5 compilar un programa que se cre´ y prob´ con o ovalores RGB . Su declaraci´n en C++ ser´ se- o ıa ´xito en otra m´quina y por tanto est´ libre e a amejante a esta: de errores sint´cticos. Dicho de otro modo, los ain t c o l o r p i x e l ( in t x , i n t y , f l o a t r problemas de los que se hablar´ aqu´ son los a ı , float g , float b ) ; debidos a las diferencias que pueden existir en- Cuando el compilador se encuentra con una tre la m´quina en la que pretendemos compilar allamada a esta funci´n como, por ejemplo, la o el programa y aquella en la que se desarroll´ y osiguiente: prob´ el mismo. o ok= c o l o r p i x e l ( 4 0 0 , 3 0 0 , 2.3.1. Archivos de cabecera0 . 5 , 0 . 5 , 0 . 5 ) ; // g r i s . Para que el compilador pueda generar el c´-ogenerar´ las instrucciones del microprocesador digo que servir´ para llamar a las funciones de a aque sirvan para: biblioteca necesita conocer: 1. Colocar en la pila6 los cinco valores que El nombre de la funci´n a llamar. o emplear´ la funci´n, en este caso: 400, 300, a o 0.5, 0.5, 0.5. El n´mero de argumentos que recibir´ la u a funci´n y su orden. o 2. Colocar a continuaci´n la llamada a la fun- o El tipo de cada uno de los argumentos ci´n. Esto har´ que, cuando se ejecute el o a (entero, coma flotante, cadena de caracte- programa, el c´digo de dicha funci´n reco- o o res,. . . ). ja los cinco argumentos de la pila y ejecute, empleando esos valores, las instrucciones El tipo de valor que, en su caso, devuelve que sean necesarias (llamadas a la tarjeta la funci´n. o gr´fica,. . . ). a Para verificar que la llamada a la funci´n o 3. Generar el c´digo para, en su caso, alma- o puede hacerse correctamente el compilador ne- cenar el valor devuelto por la funci´n en o cesita acceder a la declaraci´n de la funci´n (en o o alguna variable cuyo nombre le habremos la que se definen los datos de la lista anterior). indicado. En este caso: ok. En C y C++ esto se resuelve empleando lo que se llama archivos de cabecera. Estos archivos Una vez que termina el proceso de compila- contienen la declaraci´n de las funciones y va- oci´n tendremos, por cada uno de los archivos o riables de la biblioteca de funciones a la quefuente que hayamos compilado, un archivo ob- corresponden.jeto que contendr´ las instrucciones del progra- a Por ejemplo en el cuadro 1 puede verse la de-ma en c´digo m´quina con llamadas a funciones o a claraci´n de la funci´n getMemoryUsed que no o ode biblioteca intercaladas. Estos archivos suelen recibe argumentos y devuelve un entero largotener la extensi´n .o en sistemas Unix y Mac o sin signo. Una llamada a esta funci´n dentro o 5 Estos valores son sencillamente las intensidades de del c´digo fuente podr´ ser: o ıacolor rojo (red: R), verde (green: G) y azul (blue: B) 7 Como se ha dicho anteriormente, compilar bajoque definen el color a mostrar en el p´ıxel. Windows un programa desarrollado en Unix es una ta- 6 Los que sean usuarios de calculadoras HP con no- rea muy dif´ salvo que se trate de un programa ex- ıciltaci´n polaca inversa (RPN) ya saben lo que es una o tremadamente simple o el desarrollador previera dichapila, los que no tengan esa suerte pueden consultar la posibilidad. En este documento se citan distintos siste-referencia [2]. mas operativos para que sea lo m´s general posible. a
  5. 5. www.xcingenieria.com ´ Pagina: 5 de 10 T´ ıtulo: Compilar un programa. . . . Fecha: 27 de julio de 2012 Apartado: 2 COMPILACION ´ ´ Revision: 0// memoria . h dicha biblioteca. Una vez instalada la biblio- teca OpenGL, este archivo puede encontrarse,#i f n d e f MEMORIA H dependiendo del sistema que usemos, en las ubi-#define MEMORIA H caciones que se dan en la tabla 3. El procedimiento que se emplea para indicarunsigned long getMemoryUsed ( void ) ; al compilador la ubicaci´n de los archivos de ca- o becera var´ de unos sistemas a otros. Por ejem- ıa#endif plo si estamos empleando el compilador GNU C++ se emplea la opci´n -I seguida del direc- oCuadro 1: Ejemplo de archivo de cabecera (muy torio en el que se encuentran los archivos depeque˜o). n cabecera. En el caso de que estuvi´ramos em- e pleando este compilador en una m´quina HP- a UX usar´ ıamos:unsigned long memOcupada= 0 ;memOcupada= getMemoryUsed ( ) ; g++ -I/opt/graphics/OpenGL/include programa.cc Con ambas informaciones (la declaraci´n y ola llamada) el compilador puede establecer la Si adem´s necesit´ramos emplear otro archi- a acorrespondencia entre los argumentos en la lla- vo de cabecera que estuviera en el directoriomada y en la declaraci´n. Tambi´n puede esta- o e /usr/local/include.blecer la correspondencia entre el valor devueltopor la funci´n y la variable a la que se asigna o g++ -I/opt/graphics/OpenGL/include(getMemoryUsed). -I/usr/local/include programa.cc Para poder hacer todo esto el compilador ne-cesita tener acceso al archivo de cabecera, es de- 2.3.2. No se encuentra un archivo de ca-cir conocer su ubicaci´n en el sistema de archi- o beceravos (por ejemplo /usr/include/math.h). Es-tos archivos se colocan en distintos directorios De lo anterior se deduce que cuando el com-dependiendo del sistema operativo que estemos pilador emite un mensaje de error como:usando y de la forma en que se haya instala- error: blas.h: No existe eldo la biblioteca cuya interfaz8 definen (paquete fichero o el directoriobinario, compilada por el usuario,. . . ). Aunque, como veremos m´s adelante, exis- a puede deberse a dos razones:ten herramientas para facilitar la soluci´n de oeste problema, para que el compilador pueda 1. Realmente el archivo blas.h no est´ ins- aacceder a determinado archivo de cabecera es talado en el sistema. Para cerciorarnos denecesario asegurarse de que: ello en los sistemas Unix podemos usar el comando: 1. La versi´n de desarrollo 9 de la biblioteca o est´ instalada en el sistema. a locate blas.h 2. El compilador conoce la ubicaci´n del ar- o Si efectivamente el archivo no est´ instala- a chivo de cabecera. do probablemente se deba a que no se ha instalado la biblioteca a la que pertenece Veamos esto con un ejemplo. Supongamos el archivo. En sistemas Debian esto puedeque queremos compilar un programa que hace averiguarse empleando el comando:uso de la biblioteca OpenGL y para ello llamaa funciones declaradas en el archivo (gl.h) de apt-file search blas.h 8 El archivo de cabecera al definir el modo en que se Si en su sistema no dispone de una utilidadpuede llamar a las distintas rutinas de la biblioteca a laque pertenece constituye su interfaz. similar puede utilizar b´squedas de Google u 9 La que proporciona los archivos de cabecera de la para inferir a qu´ biblioteca pertenece el ebiblioteca. archivo.
  6. 6. www.xcingenieria.com ´ Pagina: 6 de 10 T´ ıtulo: Compilar un programa. . . . Fecha: 27 de julio de 2012 Apartado: 3 ENLACE ´ Revision: 0 2. El archivo s´ est´ instalado pero el com- ı a 3.1.2. No se encuentra la definici´n de o pilador no puede localizarlo. En este caso una funci´n o el problema es que falta la opci´n -I que o Aunque el programa enlazara correctamente indica al compilador la ubicaci´n del ar- o en el sistema que se cre´ es posible que en nues- o chivo. Si se tiene acceso al comando que tro sistema la definici´n de alguna funci´n est´ o o e lanza la ejecuci´n del compilador bastar´ o a en un archivo de biblioteca distinto. En este ca- con a˜adir esta opci´n. Por el contrario si n o so el enlazador emitir´ un mensaje parecido al a se emplean medios m´s sofisticados para a el que sigue (el texto importante es el que reza compilar el programa como make, CMa- «undefined reference to»): ke o automake y no conocemos su funcio- namiento ser´ necesario contactar con el a blas_example.c:(.text+0xaf): undefined desarrollador para indicarle el problema. reference to ‘ddot_’ En general para localizar el archivo de biblio- teca en el que se define una funci´n comenza- o3. Enlace remos por localizar el archivo de cabecera en el que se declara la funci´n. Localizado ´ste, es fre- o e Una vez que disponemos del c´digo objeto del o cuente que (en los sistemas Unix) el archivo queprograma, para generar el c´digo ejecutable, se o contiene los binarios correspondientes tenga eldeber´ colocar en el sitio adecuado el c´digo eje- a o mismo nombre precedido del prefijo lib. Porcutable de las funciones de biblioteca a las que ejemplo las funciones declaradas en el archivollamamos. A esta operaci´n se la llama enlazar. o de cabecera gmp.h est´n definidas en el archivo aCuando el c´digo de las funciones de bibliote- o libgmp.a ´ libgmp.so. Cuando esto no sucede oca se incorpora al programa ejecutable decimos as´ es necesario consultar la documentaci´n de ı, oque en enlace es est´tico. Por el contrario cuan- a la implementaci´n de la biblioteca en cuesti´n o odo lo que se coloca en el programa ejecutable es en nuestro sistema.el c´digo necesario para ejecutar el c´digo de la o ofunci´n que residir´ en una biblioteca de enlace o a 3.1.3. No se encuentra un archivo de bi-din´mico. a blioteca De un modo u otro, cuando el linker terminasu tarea obtendremos un archivo que conten- Como en el caso de los archivos de cabeceradr´ un programa ejecutable. Estos archivos no a cuando el enlazador no encuentra el archivo desuelen tener extensi´n en los sistemas Unix y o biblioteca emite un mensaje de error como eltienen la extensi´n .EXE en los sistemas opera- o siguiente:tivos de Microsoft. /usr/bin/ld: cannot find -lblas Con ello nos indica que no encuentra el archi-3.1. Problemas que pueden pre- vo libblas.a. Igual que en el caso de los archi- sentarse al enlazar el progra- vos de cabecera, el hecho de que el enlazador no ma encuentre el archivo puede deberse a que efecti- vamente no est´ instalado (aunque en este caso e3.1.1. Archivos de biblioteca es m´s dif´ porque lo normal es que se haya a ıcil instalado junto con el archivo de cabecera) o a Los archivos de biblioteca son aquellos en los que est´ en un directorio que el enlazador no en- eque se almacena el c´digo ejecutable de las fun- o cuentra. En el primer caso la soluci´n consistir´ o aciones que componen la misma. En los sistemas en averiguar si la instalaci´n de la biblioteca es oLinux tienen las extensiones .o ´ .a cuando o defectuosa.se trata de bibliotecas est´ticas y la extensi´n a o En el segundo caso la soluci´n consiste en o.so (normalmente acompa˜ada de un n´mero n u indicar al enlazador el directorio en el que sede versi´n) cuando es una biblioteca de enlace o encuentra el archivo mediante la opci´n -L.odin´mico. En los sistemas Windows las bibliote- a Por ejemplo si se encuentra en /usr/local/libcas de enlace din´mico tienen la extensi´n .dll a o agregar´ıamos este directorio al comando quey las de enlace est´tico la extensi´n .lib. a o lanza la compilaci´n del programa. o
  7. 7. www.xcingenieria.com ´ Pagina: 7 de 10 T´ ıtulo: Compilar un programa. . . . Fecha: 27 de julio de 2012 Apartado: 7 CONCLUSION ´ ´ Revision: 0gcc -lblas -L/usr/local/lib 5.1. Empleo de CMake blas_example.c Cuando se emplea este sistema para compilar Como ocurr´ con los archivos de cabecera, ıa el programa los requerimientos del mismo en locuando se emplean sistemas de compilaci´n in- o que ser refiere a las bibliotecas que emplea ytegrados como CMake o autoconf, el procedi- otros detalles se especifican en un archivo de-miento a emplear es distinto. nominado CMakeLists.txt. Con el contenido de este archivo el programa cmake genera el ar- chivo makefile (ver apartado 4) con todas las4. La herramienta «Make» opciones -I y -L necesarias. Naturalmente el makefile generado es tan La herramienta «make» es una utilidad de bueno como lo sea la especificaci´n que haga ouso com´ n, sobre todo en entornos Unix, que u el desarrollador en CMakeLists.txt. El olvidosirve para automatizar la generaci´n de progra- o de alguna biblioteca necesaria para compilar elmas ejecutables y bibliotecas a partir del c´digo o programa dar´ lugar al correspondiente error. afuente. A tal fin se escribe un archivo denomina- Llegados a este punto cabe modificar el archivodo «makefile» en el que se especifican las reglas CMakeLists.txt para subsanar el error si sea seguir para obtener el c´digo fuente. Como o tienen conocimientos para hacerlo ´ indicar al oejemplo mostramos aqu´ el archivo makefile ı desarrollador el mensaje de error obtenido paraque se emplear´ para automatizar las tareas ıa que pueda corregirlo.que se describieron en el apartado 2.1:a l l : hola 5.2. Autoconf Como en el caso anterior este programa gene-hola : hola . o bibHola ra un archivo makefile a partir de una macro g++ h o l a . c c b i b H o l a . o −o h o l abi b Ho la : b i b H o l a . o denominada configure que es la encargada de g++ −c bi b Ho l a . c c recopilar la informaci´n acerca de la ubicaci´n o oclean : de las bibliotecas y archivos de cabecera en el rm −f h o l a h o l a . o b i b H ola . o sistema. En caso de error el procedimiento a seguir es En la referencia [4] se puede encontrar m´s el descrito en el apartado anterior. ainformaci´n sobre esta herramienta. o 6. Las instrucciones de5. Sistemas de compilaci´no compilaci´n o integrados (CMake,. . . ) Generalmente el c´digo fuente de un progra- o Los sistemas de compilaci´n integrados como o ma viene acompa˜ado de un archivo de nombre n«automake» o «CMake» suponen un paso m´s a similar install.txt o readme.txt en el que se(respecto a make) en la automatizaci´n de la o indican, m´s o menos minuciosamente, los pa- ageneraci´n del programa. Su finalidad princi- o sos a seguir para compilar el programa.pal evitar los problemas descritos acerca de la Una vez conocida, siquiera de forma some-ubicaci´n de los archivos de cabecera y de bi- o ra, la forma en que se compila un programablioteca. Para ello est´n dotados de una serie de a en ambiente Unix resultar´ m´s sencillo inter- a arutinas mediante las que se determina la ubica- pretar correctamente esas instrucciones y averi-ci´n de estos archivos en el sistema y se generan o guar c´mo corregir los fallos m´s simples cuan- o alos comandos de compilaci´n adecuados para el o do estos se produzcan.programa en el sistema de que se trate. La ventaja de estos programas es que permi-ten al desarrollador abstraerse de las particula- 7. Conclusi´n oridades de los distintos sistemas operativos. Suprincipal desventaja es que a˜aden una capa n Con la informaci´n que se proporciona en om´s al proceso oscureci´ndolo un poco. a e el presente art´ ıculo se pretende facilitar el uso
  8. 8. www.xcingenieria.com ´ Pagina: 8 de 10 T´ ıtulo: Compilar un programa. . . . Fecha: 27 de julio de 2012 Apartado: 7 CONCLUSION ´ ´ Revision: 0de software libre distribuido en forma de c´di- ogo fuente a personas cuyos conocimientos sobreprogramaci´n son escasos. o Si adem´s sirve para que alguna de esas per- asonas se anime a colaborar en proyectos de soft-ware libre o a iniciar el suyo propio el objetivoestar´ sobradamente cumplido. a Si alguien desea hacer alg´n comentario o su- ugerencia puede escribirme a la direcci´n: ol.perez@xcingenieria.com.
  9. 9. www.xcingenieria.com ´ Pagina: 9 de 10 T´ ıtulo: Compilar un programa. . . . Fecha: 27 de julio de 2012 Apartado: REFERENCIAS ´ Revision: 0Figura 1: Lenguaje de m´quina del Intel 8088. El c´digo de m´quina en hexadecimal se resalta a o aen rojo, el equivalente en lenguaje ensamblador en magenta, y las direcciones de memoria dondese encuentra el c´digo, en azul. Abajo se ve un texto en hexadecimal y ASCII (tomada de la oreferencia [1]). Figura 2: Dependencias del c´digo de un programa de ordenador. oReferencias [1] Colaboradores de Wikipedia. Compilador [en l´ ınea]. Wikipedia, La enciclo- pedia libre, 2012 [fecha de consulta: 3 de abril del 2012]. Disponible en <http://es.wikipedia.org/w/index.php?title=Compilador>. [2] Colaboradores de Wikipedia. Pila (inform´tica) [en l´ a ınea]. Wikipedia, La en- ciclopedia libre, 2012 [fecha de consulta: 3 de abril del 2012]. Disponible en <http://es.wikipedia.org/w/index.php?title=Pila (inform´tica)>. a [3] Conceptos de Inform´tica. P. Bishop. Editorial Anaya 1990. a [4] Colaboradores de Wikipedia. Make [en l´ ınea]. Wikipedia, La enciclopedia libre, 2012 [fecha de consulta: 4 de abril del 2012]. Disponible en <http://es.wikipedia.org/w/index.php?title=Make>.
  10. 10. www.xcingenieria.com ´ Pagina: 10 de 10T´ ıtulo: Compilar un programa. . . . Fecha: 27 de julio de 2012Apartado: REFERENCIAS ´ Revision: 0 Cuadro 2: Algunas funciones de la biblioteca est´ndar de C. a Sistema Ubicaci´n o Windows C:Program FilesMicrosoft SDKsWindowsv7.0AIncludeglgl.h Debian Linux /usr/include/GL/gl.h Mac OS X /usr/include/OpenGL/gl.h Solaris /usr/X11/include/GL/gl.h HP-UX /opt/graphics/OpenGL/include/GL/gl.h Cuadro 3: Ubicaciones del archivo gl.h en distintos sistemas operativos.

×