Introducci on a la compilaci on en ambiente Unix › ... › introduccion_compilacion_unix.pdf ·...

10
Introducci´on a la compilaci´on en ambiente Unix Luis C. P´ erez Tato 27 de julio de 2012 ´ Indice 1. Introducci´ on 1 1.1. ¿Porqu´ e tengo que compilar el programa? ............. 1 2. Compilaci´ on 2 2.1. Estructura del c´odigo fuente . . . 2 2.2. Bibliotecas de funciones ..... 3 2.2.1. Ejemplo de funci´ on de bi- blioteca .......... 4 2.3. Problemas que pueden presen- tarse al compilar el programa .. 4 2.3.1. Archivos de cabecera . . . 4 2.3.2. No se encuentra un archi- vo de cabecera ...... 5 3. Enlace 6 3.1. Problemas que pueden presen- tarse al enlazar el programa . . . 6 3.1.1. Archivos de biblioteca .. 6 3.1.2. No se encuentra la defini- ci´ on de una funci´ on ... 6 3.1.3. No se encuentra un archi- vo de biblioteca ...... 6 4. La herramienta «Make» 7 5. Sistemas de compilaci´ on integra- dos (CMake,. . . ) 7 5.1. Empleo de CMake ........ 7 5.2. Autoconf ............. 7 6. Las instrucciones de compilaci´ on 7 7. Conclusi´ on 7 1. Introducci´on Este art´ ıculo se redacta pensando en aque- llas personas que tienen conocimientos de in- form´ atica a nivel de usuario y desean aprender a compilar e instalar programas que se distri- buyen en forma de c´odigo fuente. En particular se pretende facilitar la instalaci´ on del programa Xc 1 . Con ese fin se introducen algunos conceptos asicos acerca de la generaci´ on de c´ odigo eje- cutable para, posteriormente, explicar c´ omo se resuelven los problemas m´as frecuentes a la ho- ra de compilar un programa en un ambiente ligeramente diferente al de la m´aquina en que se cre´ o. Aunque frecuentemente se emplea la palabra compilar para referirse a la obtenci´ on de un programa ejecutable a partir del c´odigo fuente del mismo, en realidad dicho proceso requiere realizar dos operaciones: compilaci´ on y enlace. as adelante se explica brevemente en qu´ e con- sisten estas operaciones. En las p´ aginas siguientes se intentar´ a trans- mitir al lector los conocimientos b´ asicos necesa- rios que le permitan iniciarse en el uso de pro- gramas distribuidos en forma de c´odigo fuente. 1.1. ¿Porqu´ e tengo que compilar el programa? Puede que uno se pregunte acerca de la nece- sidad de compilar el programa en lugar de em- plear un c´ omodo programa de instalaci´ on que oculte al usuario la complejidad del proceso de generar c´odigo ejecutable para una m´aquina de- terminada. Cuando un programa est´ a dise˜ nado para eje- cutarse en un s´ olo sistema operativo que co- 1 Xc es un programa de an´ alisis de estructuras me- diante elementos finitos de c´ odigo abierto 1

Transcript of Introducci on a la compilaci on en ambiente Unix › ... › introduccion_compilacion_unix.pdf ·...

Page 1: Introducci on a la compilaci on en ambiente Unix › ... › introduccion_compilacion_unix.pdf · mos encontrar distintas distribuciones de Linux (Ubuntu, Linux Mint, Debian, Red

Introduccion a la compilacion en ambiente Unix

Luis C. Perez Tato

27 de julio de 2012

Indice

1. Introduccion 11.1. ¿Porque tengo que compilar el

programa? . . . . . . . . . . . . . 1

2. Compilacion 22.1. Estructura del codigo fuente . . . 22.2. Bibliotecas de funciones . . . . . 3

2.2.1. Ejemplo de funcion de bi-blioteca . . . . . . . . . . 4

2.3. Problemas que pueden presen-tarse al compilar el programa . . 42.3.1. Archivos de cabecera . . . 42.3.2. No se encuentra un archi-

vo de cabecera . . . . . . 5

3. Enlace 63.1. Problemas que pueden presen-

tarse al enlazar el programa . . . 63.1.1. Archivos de biblioteca . . 63.1.2. No se encuentra la defini-

cion de una funcion . . . 63.1.3. No se encuentra un archi-

vo de biblioteca . . . . . . 6

4. La herramienta «Make» 7

5. Sistemas de compilacion integra-dos (CMake,. . . ) 75.1. Empleo de CMake . . . . . . . . 75.2. Autoconf . . . . . . . . . . . . . 7

6. Las instrucciones de compilacion 7

7. Conclusion 7

1. Introduccion

Este artıculo se redacta pensando en aque-llas personas que tienen conocimientos de in-formatica a nivel de usuario y desean aprendera compilar e instalar programas que se distri-buyen en forma de codigo fuente. En particularse pretende facilitar la instalacion del programaXc1.

Con ese fin se introducen algunos conceptosbasicos acerca de la generacion de codigo eje-cutable para, posteriormente, explicar como seresuelven los problemas mas frecuentes a la ho-ra de compilar un programa en un ambienteligeramente diferente al de la maquina en quese creo.

Aunque frecuentemente se emplea la palabracompilar para referirse a la obtencion de unprograma ejecutable a partir del codigo fuentedel mismo, en realidad dicho proceso requiererealizar dos operaciones: compilacion y enlace.Mas adelante se explica brevemente en que con-sisten estas operaciones.

En las paginas siguientes se intentara trans-mitir al lector los conocimientos basicos necesa-rios que le permitan iniciarse en el uso de pro-gramas distribuidos en forma de codigo fuente.

1.1. ¿Porque tengo que compilarel programa?

Puede que uno se pregunte acerca de la nece-sidad de compilar el programa en lugar de em-plear un comodo programa de instalacion queoculte al usuario la complejidad del proceso degenerar codigo ejecutable para una maquina de-terminada.

Cuando un programa esta disenado para eje-cutarse en un solo sistema operativo que co-

1Xc es un programa de analisis de estructuras me-diante elementos finitos de codigo abierto

1

Page 2: Introducci on a la compilaci on en ambiente Unix › ... › introduccion_compilacion_unix.pdf · mos encontrar distintas distribuciones de Linux (Ubuntu, Linux Mint, Debian, Red

www.xcingenieria.com

Tıtulo: Compilar un programa. . . .

Apartado: 2 COMPILACION

Pagina: 2 de 10Fecha: 27 de julio de 2012Revision: 0

rre sobre un solo tipo de maquina (por ejemploOS X y Mac) es relativamente sencillo generarun ejecutable valido para dichas maquinas y unprograma de instalacion que se encargue de co-locar el archivo ejecutable y otros archivos quesean necesarios para la ejecucion, en los lugaresadecuados.

Sin embargo, si lo que se pretende es que elprograma se pueda instalar en una familia demaquinas tan amplia como sea posible la solu-cion anterior no resulta tan sencilla de aplicar.El problema radica en la variedad de arquitec-turas para las que hay que resolver la instala-cion. Por ejemplo considerando solo las arqui-tecturas de hardware mas populares tendremos:

Intel IA-32.

Intel IA-64.

AMD64.

Por otra parte sobre esa arquitectura podrıa-mos encontrar distintas distribuciones de Linux(Ubuntu, Linux Mint, Debian, Red Hat, Suse,Fedora,. . . ) u otros sistemas de similares carac-terısticas HP-UX, IBM-AIX, Solaris, etcetera.

El coste de elaborar soluciones para la ins-talacion, aunque solo fuera para unas pocas deentre las combinaciones posibles, es muy gran-de2.

Si en lugar de ello lo que se hace es distri-buir el codigo fuente y dejar al usuario la tareade compilarlo el problema se simplifica bastan-te y la tarea que se traslada al usuario no esdemasiado complicada en la mayor parte de loscasos3

Como puede ver el argumento es muy similara los que emplea una conocida cadena de dis-tribucion de muebles para justificar que sea elcliente el que tenga que transportarlos hasta sucasa y montarlos.

2Las distintas distribuciones de Linux resuelven es-te problema empleando a personas (los denominados«package maintainers») que se dedican a adaptar unprograma determinado (como por ejemplo Gimp www.

gimp.org) a la distribucion en cuestion.3La tarea sera tanto mas complicada cuanto mas di-

ferente sea la maquina en la que se pretende compilarel programa de aquella en la que se creo el mismo. Porejemplo si se intenta compilar un programa disenadopara Unix en una maquina Windows el dolor de cabezaesta practicamente garantizado.

2. Compilacion

Compilar, en nuestro contexto, consiste en«traducir» el codigo fuente escrito en un len-guaje de alto nivel (C, C++, Fortran,. . . ) a unasecuencia de instrucciones directamente inter-pretable por el procesador (Intel, Sparc, Moto-rola,. . . ) (lenguaje de maquina).

Para hacerse una idea de que aspecto tiene ellenguaje de maquina puede examinarse la figura1.

2.1. Estructura del codigo fuente

El codigo fuente de un programa estara for-mado por el del programa principal y las bi-bliotecas de funciones que acompanan a este.Para dar una idea de en que consiste esto enlos parrafos siguientes se desarrolla un ejemploque, aun siendo trivial, contiene los elementosbasicos que forman el problema. Por otra parteen la figura 2 se intentan representar las relacio-nes de dependencia del programa con el sistemaoperativo y el hardware en el que se pretendeejecutar.

Supongamos que tenemos un archivo de nom-bre hola.cc con el siguiente contenido:

#include <iostream>int main ( )

{std : : cout << ”Hola a todos . ”

<< std : : endl ;return 0 ;

}

como el nombre del archivo lleva la extension«cc» suponemos que se trata de un programaescrito en C++ (si estuviera escrito en FOR-TRAN deberıa llevar la extension «for», enPython la extension «py»,. . . ). Por otra par-te como en el programa se define la funcion«main» sabemos que el archivo corresponde alprograma principal ya que en C++ (y en C) lafuncion que se ejecuta al lanzar la ejecucion delprograma es precisamente esta.

Si examinamos la primera lınea del codigo enla que se lee #include <iostream> deducimosque el programa emplea el archivo de cabece-ra denominado «iostream» y, con un poco deesfuerzo se puede averiguar (aunque en generalno sera necesario) que en un sistema Debian Li-nux version 6 esto implica usar la biblioteca de

Page 3: Introducci on a la compilaci on en ambiente Unix › ... › introduccion_compilacion_unix.pdf · mos encontrar distintas distribuciones de Linux (Ubuntu, Linux Mint, Debian, Red

www.xcingenieria.com

Tıtulo: Compilar un programa. . . .

Apartado: 2 COMPILACION

Pagina: 3 de 10Fecha: 27 de julio de 2012Revision: 0

funciones «LibCXX 3.4» que forma parte delsistema operativo.Ası que el programa hola.cc esta formado

por un unico archivo y (en mi sistema) solo usala biblioteca de funciones LibCXX version 3.4.Si el lector usa alguna variante de Unix y quierecompilar este programa, con el compilador deGNU, puede hacerlo mediante:

g++ hola.cc -o hola

Para ilustrar el caso general, en el que el pro-grama a compilar emplea bibliotecas de fun-ciones cuyo codigo fuente se suministra con elmismo, escribiremos el archivo bibHola.h quecontendra lo siguiente:

// b ibHola . h

#ifndef BIBHOLA H#define BIBHOLA H

#include <s t r i ng>

void print msg ( const std : : s t r i n g &msg ) ;

#endif

Este sera el archivo de cabecera de nuestrabiblioteca en el que se declara una sola funciona la que hemos llamado pring_msg.La implementacion de la funcion la escri-

biremos en un archivo al que llamaremosbibHola.cc y aquı definiremos lo que hace lafuncion:

// b ibHola . cc

#include ”bibHola . h”#include <iostream>

void print msg ( const std : : s t r i n g &msg){

std : : cout << msg << std : : endl ;}

Por ultimo modificaremos el contenido del ar-chivo hola.cc como sigue:

#include ”bibHola . h”int main (void )

{print msg ( ”Hola a todos . ” ) ;return 0 ;

}

Ahora el programa principal usa la funcionpring_msg de nuestra raquıtica biblioteca defunciones «bibHola».

Ahora el proceso para generar el ejecutableun poco mas complicado. Primero deberemoscompilar la biblioteca de funciones. Para elloteclearıamos:

g++ -c bibHola.cc -o bibHola.o

y a continuacion generaremos el ejecutable me-diante:

g++ bibHola.o hola.cc -o hola

El ejemplo descrito hasta aquı, a pesar de susimplicidad, ilustra las principales tareas quedeben realizarse para compilar cualquier pro-grama. En los apartados siguientes se desarro-llan un poco mas algunos aspectos de lo tratadoaquı de forma tan superficial.

2.2. Bibliotecas de funciones

Un microprocesador es capaz, por sı solo, deejecutar instrucciones sencillas como la suma,resta y producto de numeros. Tambien existenmicroprocesadores que incorporan rutinas pa-ra procesar operaciones no tan sencillas comoevaluar funciones trigonometricas4, logaritmos,etcetera.El resto de las operaciones que realiza un pro-

grama (mostrar texto y figuras en un monitor,leer y escribir en discos duros, memorias USBy perifericos de todo tipo,. . . ) se realizan con elauxilio de lo que llamamos funciones de biblio-teca. Ese es el motivo de que cuando se adquiereun elemento de hardware nuevo (tarjeta de vı-deo, escaner,. . . ) venga acompanado de un dis-co con sus «drivers», es decir, con las funcionesde biblioteca que permitiran al sistema opera-tivo de la maquina y a otras aplicaciones mane-jar el dispositivo (mostrar graficos 3D, escaneardocumentos,. . . ).Estas funciones de biblioteca no son mas que

secuencias de instrucciones basicas que sirvenpara facilitar la ejecucion de una operacion re-lativamente compleja (por ejemplo calcular eldeterminante de una matriz), o acceder a de-terminada caracterıstica de determinado hard-ware (por ejemplo borrar lo que se muestra enpantalla).

4A los usuarios mas veteranos de ordenadores de ti-po PC les resultara familiar el termino «coprocesadormatematico» que popularizo Intel en los anos 80.

Page 4: Introducci on a la compilaci on en ambiente Unix › ... › introduccion_compilacion_unix.pdf · mos encontrar distintas distribuciones de Linux (Ubuntu, Linux Mint, Debian, Red

www.xcingenieria.com

Tıtulo: Compilar un programa. . . .

Apartado: 2 COMPILACION

Pagina: 4 de 10Fecha: 27 de julio de 2012Revision: 0

2.2.1. Ejemplo de funcion de biblioteca

Para dar una idea un poco mas aproximadade lo que se intenta describir en este apartadopondremos un ejemplo trivial.Supongamos una funcion que se encarga de

cambiar el color de un pıxel en la pantalla. Es-ta funcion podrıa recibir como argumentos lascoordenadas x e y del pıxel en cuestion y losvalores RGB5. Su declaracion en C++ serıa se-mejante a esta:

int c o l o r p i x e l ( int x , int y , f loat r, f loat g , f loat b ) ;

Cuando el compilador se encuentra con unallamada a esta funcion como, por ejemplo, lasiguiente:

ok= c o l o r p i x e l (400 ,300 ,0 . 5 , 0 . 5 , 0 . 5 ) ; // g r i s .

generara las instrucciones del microprocesadorque sirvan para:

1. Colocar en la pila6 los cinco valores queempleara la funcion, en este caso: 400, 300,0.5, 0.5, 0.5.

2. Colocar a continuacion la llamada a la fun-cion. Esto hara que, cuando se ejecute elprograma, el codigo de dicha funcion reco-ja los cinco argumentos de la pila y ejecute,empleando esos valores, las instruccionesque sean necesarias (llamadas a la tarjetagrafica,. . . ).

3. Generar el codigo para, en su caso, alma-cenar el valor devuelto por la funcion enalguna variable cuyo nombre le habremosindicado. En este caso: ok.

Una vez que termina el proceso de compila-cion tendremos, por cada uno de los archivosfuente que hayamos compilado, un archivo ob-jeto que contendra las instrucciones del progra-ma en codigo maquina con llamadas a funcionesde biblioteca intercaladas. Estos archivos suelentener la extension .o en sistemas Unix y Mac

5Estos valores son sencillamente las intensidades decolor rojo (red: R), verde (green: G) y azul (blue: B)que definen el color a mostrar en el pıxel.

6Los que sean usuarios de calculadoras HP con no-tacion polaca inversa (RPN) ya saben lo que es unapila, los que no tengan esa suerte pueden consultar lareferencia [2].

OS, y .obj en los sistemas operativos de Mi-crosoft7.

2.3. Problemas que pueden pre-sentarse al compilar el pro-grama

En lo que sigue se supone que tratamos decompilar un programa que se creo y probo conexito en otra maquina y por tanto esta librede errores sintacticos. Dicho de otro modo, losproblemas de los que se hablara aquı son losdebidos a las diferencias que pueden existir en-tre la maquina en la que pretendemos compilarel programa y aquella en la que se desarrollo yprobo el mismo.

2.3.1. Archivos de cabecera

Para que el compilador pueda generar el co-digo que servira para llamar a las funciones debiblioteca necesita conocer:

El nombre de la funcion a llamar.

El numero de argumentos que recibira lafuncion y su orden.

El tipo de cada uno de los argumentos(entero, coma flotante, cadena de caracte-res,. . . ).

El tipo de valor que, en su caso, devuelvela funcion.

Para verificar que la llamada a la funcionpuede hacerse correctamente el compilador ne-cesita acceder a la declaracion de la funcion (enla que se definen los datos de la lista anterior).En C y C++ esto se resuelve empleando lo quese llama archivos de cabecera. Estos archivoscontienen la declaracion de las funciones y va-riables de la biblioteca de funciones a la quecorresponden.Por ejemplo en el cuadro 1 puede verse la de-

claracion de la funcion getMemoryUsed que norecibe argumentos y devuelve un entero largosin signo. Una llamada a esta funcion dentrodel codigo fuente podrıa ser:

7Como se ha dicho anteriormente, compilar bajoWindows un programa desarrollado en Unix es una ta-rea muy difıcil salvo que se trate de un programa ex-tremadamente simple o el desarrollador previera dichaposibilidad. En este documento se citan distintos siste-mas operativos para que sea lo mas general posible.

Page 5: Introducci on a la compilaci on en ambiente Unix › ... › introduccion_compilacion_unix.pdf · mos encontrar distintas distribuciones de Linux (Ubuntu, Linux Mint, Debian, Red

www.xcingenieria.com

Tıtulo: Compilar un programa. . . .

Apartado: 2 COMPILACION

Pagina: 5 de 10Fecha: 27 de julio de 2012Revision: 0

//memoria . h

#ifndef MEMORIA H#define MEMORIA H

unsigned long getMemoryUsed (void ) ;

#endif

Cuadro 1: Ejemplo de archivo de cabecera (muypequeno).

unsigned long memOcupada= 0 ;memOcupada= getMemoryUsed ( ) ;

Con ambas informaciones (la declaracion yla llamada) el compilador puede establecer lacorrespondencia entre los argumentos en la lla-mada y en la declaracion. Tambien puede esta-blecer la correspondencia entre el valor devueltopor la funcion y la variable a la que se asigna(getMemoryUsed).

Para poder hacer todo esto el compilador ne-cesita tener acceso al archivo de cabecera, es de-cir conocer su ubicacion en el sistema de archi-vos (por ejemplo /usr/include/math.h). Es-tos archivos se colocan en distintos directoriosdependiendo del sistema operativo que estemosusando y de la forma en que se haya instala-do la biblioteca cuya interfaz8 definen (paquetebinario, compilada por el usuario,. . . ).

Aunque, como veremos mas adelante, exis-ten herramientas para facilitar la solucion deeste problema, para que el compilador puedaacceder a determinado archivo de cabecera esnecesario asegurarse de que:

1. La version de desarrollo9 de la bibliotecaesta instalada en el sistema.

2. El compilador conoce la ubicacion del ar-chivo de cabecera.

Veamos esto con un ejemplo. Supongamosque queremos compilar un programa que haceuso de la biblioteca OpenGL y para ello llamaa funciones declaradas en el archivo (gl.h) de

8El archivo de cabecera al definir el modo en que sepuede llamar a las distintas rutinas de la biblioteca a laque pertenece constituye su interfaz.

9La que proporciona los archivos de cabecera de labiblioteca.

dicha biblioteca. Una vez instalada la biblio-teca OpenGL, este archivo puede encontrarse,dependiendo del sistema que usemos, en las ubi-caciones que se dan en la tabla 3.El procedimiento que se emplea para indicar

al compilador la ubicacion de los archivos de ca-becera varıa de unos sistemas a otros. Por ejem-plo si estamos empleando el compilador GNUC++ se emplea la opcion -I seguida del direc-torio en el que se encuentran los archivos decabecera. En el caso de que estuvieramos em-pleando este compilador en una maquina HP-UX usarıamos:

g++ -I/opt/graphics/OpenGL/include

programa.cc

Si ademas necesitaramos emplear otro archi-vo de cabecera que estuviera en el directorio/usr/local/include.

g++ -I/opt/graphics/OpenGL/include

-I/usr/local/include programa.cc

2.3.2. No se encuentra un archivo de ca-becera

De lo anterior se deduce que cuando el com-pilador emite un mensaje de error como:

error: blas.h: No existe el

fichero o el directorio

puede deberse a dos razones:

1. Realmente el archivo blas.h no esta ins-talado en el sistema. Para cerciorarnos deello en los sistemas Unix podemos usar elcomando:

locate blas.h

Si efectivamente el archivo no esta instala-do probablemente se deba a que no se hainstalado la biblioteca a la que perteneceel archivo. En sistemas Debian esto puedeaveriguarse empleando el comando:

apt-file search blas.h

Si en su sistema no dispone de una utilidadsimilar puede utilizar busquedas de Googlepara inferir a que biblioteca pertenece elarchivo.

Page 6: Introducci on a la compilaci on en ambiente Unix › ... › introduccion_compilacion_unix.pdf · mos encontrar distintas distribuciones de Linux (Ubuntu, Linux Mint, Debian, Red

www.xcingenieria.com

Tıtulo: Compilar un programa. . . .Apartado: 3 ENLACE

Pagina: 6 de 10Fecha: 27 de julio de 2012Revision: 0

2. El archivo sı esta instalado pero el com-pilador no puede localizarlo. En este casoel problema es que falta la opcion -I queindica al compilador la ubicacion del ar-chivo. Si se tiene acceso al comando quelanza la ejecucion del compilador bastaracon anadir esta opcion. Por el contrario sise emplean medios mas sofisticados paracompilar el programa como make, CMa-ke o automake y no conocemos su funcio-namiento sera necesario contactar con eldesarrollador para indicarle el problema.

3. Enlace

Una vez que disponemos del codigo objeto delprograma, para generar el codigo ejecutable, sedebera colocar en el sitio adecuado el codigo eje-cutable de las funciones de biblioteca a las quellamamos. A esta operacion se la llama enlazar.Cuando el codigo de las funciones de bibliote-ca se incorpora al programa ejecutable decimosque en enlace es estatico. Por el contrario cuan-do lo que se coloca en el programa ejecutable esel codigo necesario para ejecutar el codigo de lafuncion que residira en una biblioteca de enlacedinamico.

De un modo u otro, cuando el linker terminasu tarea obtendremos un archivo que conten-dra un programa ejecutable. Estos archivos nosuelen tener extension en los sistemas Unix ytienen la extension .EXE en los sistemas opera-tivos de Microsoft.

3.1. Problemas que pueden pre-sentarse al enlazar el progra-ma

3.1.1. Archivos de biblioteca

Los archivos de biblioteca son aquellos en losque se almacena el codigo ejecutable de las fun-ciones que componen la misma. En los sistemasLinux tienen las extensiones .o o .a cuandose trata de bibliotecas estaticas y la extension.so (normalmente acompanada de un numerode version) cuando es una biblioteca de enlacedinamico. En los sistemas Windows las bibliote-cas de enlace dinamico tienen la extension .dll

y las de enlace estatico la extension .lib.

3.1.2. No se encuentra la definicion deuna funcion

Aunque el programa enlazara correctamenteen el sistema que se creo es posible que en nues-tro sistema la definicion de alguna funcion esteen un archivo de biblioteca distinto. En este ca-so el enlazador emitira un mensaje parecido alel que sigue (el texto importante es el que reza«undefined reference to»):

blas_example.c:(.text+0xaf): undefined

reference to ‘ddot_’

En general para localizar el archivo de biblio-teca en el que se define una funcion comenza-remos por localizar el archivo de cabecera en elque se declara la funcion. Localizado este, es fre-cuente que (en los sistemas Unix) el archivo quecontiene los binarios correspondientes tenga elmismo nombre precedido del prefijo lib. Porejemplo las funciones declaradas en el archivode cabecera gmp.h estan definidas en el archivolibgmp.a o libgmp.so. Cuando esto no sucedeası, es necesario consultar la documentacion dela implementacion de la biblioteca en cuestionen nuestro sistema.

3.1.3. No se encuentra un archivo de bi-blioteca

Como en el caso de los archivos de cabeceracuando el enlazador no encuentra el archivo debiblioteca emite un mensaje de error como elsiguiente:

/usr/bin/ld: cannot find -lblas

Con ello nos indica que no encuentra el archi-vo libblas.a. Igual que en el caso de los archi-vos de cabecera, el hecho de que el enlazador noencuentre el archivo puede deberse a que efecti-vamente no este instalado (aunque en este casoes mas difıcil porque lo normal es que se hayainstalado junto con el archivo de cabecera) o aque este en un directorio que el enlazador no en-cuentra. En el primer caso la solucion consistiraen averiguar si la instalacion de la biblioteca esdefectuosa.En el segundo caso la solucion consiste en

indicar al enlazador el directorio en el que seencuentra el archivo mediante la opcion -L.Por ejemplo si se encuentra en /usr/local/lib

agregarıamos este directorio al comando quelanza la compilacion del programa.

Page 7: Introducci on a la compilaci on en ambiente Unix › ... › introduccion_compilacion_unix.pdf · mos encontrar distintas distribuciones de Linux (Ubuntu, Linux Mint, Debian, Red

www.xcingenieria.com

Tıtulo: Compilar un programa. . . .

Apartado: 7 CONCLUSION

Pagina: 7 de 10Fecha: 27 de julio de 2012Revision: 0

gcc -lblas -L/usr/local/lib

blas_example.c

Como ocurrıa con los archivos de cabecera,cuando se emplean sistemas de compilacion in-tegrados como CMake o autoconf, el procedi-miento a emplear es distinto.

4. La herramienta «Make»La herramienta «make» es una utilidad de

uso comun, sobre todo en entornos Unix, quesirve para automatizar la generacion de progra-mas ejecutables y bibliotecas a partir del codigofuente. A tal fin se escribe un archivo denomina-do «makefile» en el que se especifican las reglasa seguir para obtener el codigo fuente. Comoejemplo mostramos aquı el archivo makefile

que se emplearıa para automatizar las tareasque se describieron en el apartado 2.1:

a l l : ho la

hola : hola . o bibHolag++ hola . cc bibHola . o −o hola

bibHola : bibHola . og++ −c bibHola . cc

c l ean :rm −f ho la hola . o bibHola . o

En la referencia [4] se puede encontrar masinformacion sobre esta herramienta.

5. Sistemas de compilacionintegrados (CMake,. . . )

Los sistemas de compilacion integrados como«automake» o «CMake» suponen un paso mas(respecto a make) en la automatizacion de lageneracion del programa. Su finalidad princi-pal evitar los problemas descritos acerca de laubicacion de los archivos de cabecera y de bi-blioteca. Para ello estan dotados de una serie derutinas mediante las que se determina la ubica-cion de estos archivos en el sistema y se generanlos comandos de compilacion adecuados para elprograma en el sistema de que se trate.La ventaja de estos programas es que permi-

ten al desarrollador abstraerse de las particula-ridades de los distintos sistemas operativos. Suprincipal desventaja es que anaden una capamas al proceso oscureciendolo un poco.

5.1. Empleo de CMake

Cuando se emplea este sistema para compilarel programa los requerimientos del mismo en loque ser refiere a las bibliotecas que emplea yotros detalles se especifican en un archivo de-nominado CMakeLists.txt. Con el contenidode este archivo el programa cmake genera el ar-chivo makefile (ver apartado 4) con todas lasopciones -I y -L necesarias.Naturalmente el makefile generado es tan

bueno como lo sea la especificacion que hagael desarrollador en CMakeLists.txt. El olvidode alguna biblioteca necesaria para compilar elprograma dara lugar al correspondiente error.Llegados a este punto cabe modificar el archivoCMakeLists.txt para subsanar el error si setienen conocimientos para hacerlo o indicar aldesarrollador el mensaje de error obtenido paraque pueda corregirlo.

5.2. Autoconf

Como en el caso anterior este programa gene-ra un archivo makefile a partir de una macrodenominada configure que es la encargada derecopilar la informacion acerca de la ubicacionde las bibliotecas y archivos de cabecera en elsistema.En caso de error el procedimiento a seguir es

el descrito en el apartado anterior.

6. Las instrucciones decompilacion

Generalmente el codigo fuente de un progra-ma viene acompanado de un archivo de nombresimilar install.txt o readme.txt en el que seindican, mas o menos minuciosamente, los pa-sos a seguir para compilar el programa.Una vez conocida, siquiera de forma some-

ra, la forma en que se compila un programaen ambiente Unix resultara mas sencillo inter-pretar correctamente esas instrucciones y averi-guar como corregir los fallos mas simples cuan-do estos se produzcan.

7. Conclusion

Con la informacion que se proporciona enel presente artıculo se pretende facilitar el uso

Page 8: Introducci on a la compilaci on en ambiente Unix › ... › introduccion_compilacion_unix.pdf · mos encontrar distintas distribuciones de Linux (Ubuntu, Linux Mint, Debian, Red

www.xcingenieria.com

Tıtulo: Compilar un programa. . . .

Apartado: 7 CONCLUSION

Pagina: 8 de 10Fecha: 27 de julio de 2012Revision: 0

de software libre distribuido en forma de codi-go fuente a personas cuyos conocimientos sobreprogramacion son escasos.Si ademas sirve para que alguna de esas per-

sonas se anime a colaborar en proyectos de soft-ware libre o a iniciar el suyo propio el objetivoestara sobradamente cumplido.Si alguien desea hacer algun comentario o su-

gerencia puede escribirme a la direccion:[email protected].

Page 9: Introducci on a la compilaci on en ambiente Unix › ... › introduccion_compilacion_unix.pdf · mos encontrar distintas distribuciones de Linux (Ubuntu, Linux Mint, Debian, Red

www.xcingenieria.com

Tıtulo: Compilar un programa. . . .Apartado: REFERENCIAS

Pagina: 9 de 10Fecha: 27 de julio de 2012Revision: 0

Figura 1: Lenguaje de maquina del Intel 8088. El codigo de maquina en hexadecimal se resaltaen rojo, el equivalente en lenguaje ensamblador en magenta, y las direcciones de memoria dondese encuentra el codigo, en azul. Abajo se ve un texto en hexadecimal y ASCII (tomada de lareferencia [1]).

Figura 2: Dependencias del codigo de un programa de ordenador.

Referencias

[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 (informatica) [en lı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 (informatica)>.

[3] Conceptos de Informatica. P. Bishop. Editorial Anaya 1990.

[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>.

Page 10: Introducci on a la compilaci on en ambiente Unix › ... › introduccion_compilacion_unix.pdf · mos encontrar distintas distribuciones de Linux (Ubuntu, Linux Mint, Debian, Red

www.xcingenieria.com

Tıtulo: Compilar un programa. . . .Apartado: REFERENCIAS

Pagina: 10 de 10Fecha: 27 de julio de 2012Revision: 0

Cuadro 2: Algunas funciones de la biblioteca estandar de C.

Sistema UbicacionWindows C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\gl\gl.hDebian Linux /usr/include/GL/gl.hMac OS X /usr/include/OpenGL/gl.hSolaris /usr/X11/include/GL/gl.hHP-UX /opt/graphics/OpenGL/include/GL/gl.h

Cuadro 3: Ubicaciones del archivo gl.h en distintos sistemas operativos.