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
                                                                       o
2. 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 palabra
3. 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.
                                                                                       o

5. 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                           o
7. 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
www.xcingenieria.com                                    ´
                                                                          Pagina:        2 de 10
 T´
  ıtulo:          Compilar un programa. . . .                             Fecha:         27 de julio de 2012
 Apartado:        2 COMPILACION ´                                               ´
                                                                          Revision:      0


rre sobre un s´lo tipo de m´quina (por ejemplo
               o            a                             2.      Compilaci´n
                                                                           o
OS X y Mac) es relativamente sencillo generar
un ejecutable v´lido para dichas m´quinas y un
                 a                  a                        Compilar, en nuestro contexto, consiste en
programa de instalaci´n que se encargue de co-
                       o                                  «traducir» el c´digo fuente escrito en un len-
                                                                              o
locar el archivo ejecutable y otros archivos que          guaje de alto nivel (C, C++, Fortran,. . . ) a una
sean 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).
                                                                                     a
programa se pueda instalar en una familia de                 Para hacerse una idea de qu´ aspecto tiene el
                                                                                          e
m´quinas tan amplia como sea posible la solu-
  a                                                       lenguaje de m´quina puede examinarse la figura
                                                                            a
ci´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
                                                                                   o
tecturas 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 sistema
mos 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 es
demasiado complicada en la mayor parte de los como el nombre del archivo lleva la extensi´n                      o
casos  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                        o
tribuci´n de muebles para justificar que sea el
         o                                               Python la extensi´n «py»,. . . ). Por otra par-
                                                                                   o
cliente el que tenga que transportarlos hasta su te como en el programa se define la funci´n                      o
casa 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                                             o
te 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
                                                                                                           o
programa 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
                 a
el programa de aquella en la que se cre´ el mismo. Por
                                        o
                                                         esfuerzo se puede averiguar (aunque en general
ejemplo si se intenta compilar un programa dise˜ ado
                                                   n
para Unix en una m´quina Windows el dolor de cabeza no ser´ necesario) que en un sistema Debian Li-
                     a                                           a
est´ pr´cticamente garantizado.
   a a                                                   nux versi´n 6 esto implica usar la biblioteca de
                                                                      o
www.xcingenieria.com                              ´
                                                                          Pagina:         3 de 10
  T´
   ıtulo:               Compilar un programa. . . .                       Fecha:          27 de julio de 2012
  Apartado:             2 COMPILACION ´                                         ´
                                                                          Revision:       0


funciones «LibCXX 3.4» que forma parte del                    Ahora el proceso para generar el ejecutable
sistema operativo.                                          un poco m´s complicado. Primero deberemos
                                                                       a
   As´ que el programa hola.cc est´ formado
      ı                               a                     compilar la biblioteca de funciones. Para ello
por un unico archivo y (en mi sistema) s´lo usa
         ´                                o                 teclear´
                                                                   ıamos:
la biblioteca de funciones LibCXX versi´n 3.4.
                                          o
Si el lector usa alguna variante de Unix y quiere           g++ -c bibHola.cc -o bibHola.o
compilar este programa, con el compilador de
GNU, 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 hola
grama 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 que
contendr´ 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 como
biblioteca en el que se declara una sola funci´n
                                              o             evaluar funciones trigonom´tricas4 , logaritmos,
                                                                                            e
a 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 USB
funci´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 funciones
void 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
                                                                                                          a
chivo 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                  o
in 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-
                                                                                a
pring_msg de nuestra raqu´ıtica biblioteca de               po PC les resultar´ familiar el t´rmino «coprocesador
                                                                              a              e
funciones «bibHola».                                        matem´tico» que populariz´ Intel en los a˜os 80.
                                                                 a                     o             n
www.xcingenieria.com                                 ´
                                                                          Pagina:         4 de 10
 T´
  ıtulo:             Compilar un programa. . . .                          Fecha:          27 de julio de 2012
 Apartado:           2 COMPILACION ´                                            ´
                                                                          Revision:       0


2.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
                                         a
de lo que se intenta describir en este apartado
pondremos 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                               grama
ta funci´n podr´ recibir como argumentos las
        o          ıa
                                                             En lo que sigue se supone que tratamos de
coordenadas x e y del p´        ıxel en cuesti´n y los
                                                   o
               5                                          compilar un programa que se cre´ y prob´ con
                                                                                            o       o
valores RGB . Su declaraci´n en C++ ser´ se-
                                  o                    ıa
                                                          ´xito en otra m´quina y por tanto est´ libre
                                                          e                a                      a
mejante a esta:
                                                          de errores sint´cticos. Dicho de otro modo, los
                                                                         a
in 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
                                                                  a
llamada a esta funci´n como, por ejemplo, la
                           o                              el programa y aquella en la que se desarroll´ y
                                                                                                       o
siguiente:                                                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 cabecera
0 . 5 , 0 . 5 , 0 . 5 ) ; // g r i s .
                                                 Para que el compilador pueda generar el c´-o
generar´ las instrucciones del microprocesador digo que servir´ para llamar a las funciones de
        a                                                     a
que 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-
                                                                                   o
ci´n tendremos, por cada uno de los archivos
  o                                                        riables de la biblioteca de funciones a la que
fuente 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              o
de biblioteca intercaladas. Estos archivos suelen          recibe argumentos y devuelve un entero largo
tener 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                   ıa
color rojo (red: R), verde (green: G) y azul (blue: B)        7 Como se ha dicho anteriormente, compilar bajo

que 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-
                                                                       ıcil
taci´n polaca inversa (RPN) ya saben lo que es una
    o                                                      tremadamente simple o el desarrollador previera dicha
pila, 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
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 indicar
unsigned 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-
                                                                      o
Cuadro 1: Ejemplo de archivo de cabecera (muy torio en el que se encuentran los archivos de
peque˜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 o
la llamada) el compilador puede establecer la                  Si adem´s necesit´ramos emplear otro archi-
                                                                      a         a
correspondencia entre los argumentos en la lla-              vo de cabecera que estuviera en el directorio
mada y en la declaraci´n. Tambi´n puede esta-
                        o          e                         /usr/local/include.
blecer la correspondencia entre el valor devuelto
por 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                                              becera
vos (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 el
do la biblioteca cuya interfaz8 definen (paquete               fichero o el directorio
binario, 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
                                            o
este problema, para que el compilador pueda                   1. Realmente el archivo blas.h no est´ ins-
                                                                                                      a
acceder a determinado archivo de cabecera es                     talado en el sistema. Para cerciorarnos de
necesario 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 puede
que queremos compilar un programa que hace                       averiguarse empleando el comando:
uso de la biblioteca OpenGL y para ello llama
a 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 utilidad
puede llamar a las distintas rutinas de la biblioteca a la
que 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
                                                                                   e
biblioteca.                                                      archivo.
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-
                                                                                         o
3.       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 que
programa, para generar el c´digo ejecutable, se
                              o                      contiene los binarios correspondientes tenga el
deber´ colocar en el sitio adecuado el c´digo eje-
        a                               o            mismo nombre precedido del prefijo lib. Por
cutable de las funciones de biblioteca a las que     ejemplo las funciones declaradas en el archivo
llamamos. A esta operaci´n se la llama enlazar.
                           o                         de cabecera gmp.h est´n definidas en el archivo
                                                                            a
Cuando el c´digo de las funciones de bibliote-
             o                                       libgmp.a ´ libgmp.so. Cuando esto no sucede
                                                                o
ca se incorpora al programa ejecutable decimos       as´ es necesario consultar la documentaci´n de
                                                       ı,                                        o
que en enlace es est´tico. Por el contrario cuan-
                    a                                la implementaci´n de la biblioteca en cuesti´n
                                                                      o                              o
do lo que se coloca en el programa ejecutable es     en nuestro sistema.
el c´digo necesario para ejecutar el c´digo de la
     o                                o
funci´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 termina
su tarea obtendremos un archivo que conten-             Como en el caso de los archivos de cabecera
dr´ un programa ejecutable. Estos archivos no
   a                                                 cuando el enlazador no encuentra el archivo de
suelen tener extensi´n en los sistemas Unix y
                     o                               biblioteca emite un mensaje de error como el
tienen 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
                                                                     e
3.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-
                                                            e
que se almacena el c´digo ejecutable de las fun-
                     o                               cuentra. En el primer caso la soluci´n consistir´
                                                                                          o           a
ciones que componen la misma. En los sistemas        en averiguar si la instalaci´n de la biblioteca es
                                                                                 o
Linux 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 se
de versi´n) cuando es una biblioteca de enlace
        o                                            encuentra el archivo mediante la opci´n -L.o
din´mico. En los sistemas Windows las bibliote-
    a                                                Por ejemplo si se encuentra en /usr/local/lib
cas de enlace din´mico tienen la extensi´n .dll
                 a                      o            agregar´ıamos este directorio al comando que
y las de enlace est´tico la extensi´n .lib.
                   a               o                 lanza la compilaci´n del programa.
                                                                        o
www.xcingenieria.com                                   ´
                                                                          Pagina:       7 de 10
 T´
  ıtulo:           Compilar un programa. . . .                            Fecha:        27 de julio de 2012
 Apartado:         7 CONCLUSION ´                                               ´
                                                                          Revision:     0


gcc -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 lo
cuando se emplean sistemas de compilaci´n in-
                                       o                     que ser refiere a las bibliotecas que emplea y
tegrados 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 las
4.     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
                                                                                                o
uso com´ n, sobre todo en entornos Unix, que
         u                                                   el desarrollador en CMakeLists.txt. El olvido
sirve para automatizar la generaci´n de progra-
                                    o                        de alguna biblioteca necesaria para compilar el
mas ejecutables y bibliotecas a partir del c´digo
                                            o                programa dar´ lugar al correspondiente error.
                                                                           a
fuente. A tal fin se escribe un archivo denomina-             Llegados a este punto cabe modificar el archivo
do «makefile» en el que se especifican las reglas              CMakeLists.txt para subsanar el error si se
a seguir para obtener el c´digo fuente. Como
                             o                               tienen conocimientos para hacerlo ´ indicar al
                                                                                                  o
ejemplo mostramos aqu´ el archivo makefile
                          ı                                  desarrollador el mensaje de error obtenido para
que 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 a
bi 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                     o
clean :                                        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.
                                            a
informaci´n sobre esta herramienta.
          o

                                                             6.     Las   instrucciones                   de
5.     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-
                                                                        a
generaci´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 programa
blioteca. Para ello est´n dotados de una serie de
                       a                                     en ambiente Unix resultar´ m´s sencillo inter-
                                                                                        a a
rutinas 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                       a
los 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
                                                                            o
ridades de los distintos sistemas operativos. Su
principal desventaja es que a˜aden una capa
                                 n                              Con la informaci´n que se proporciona en
                                                                                  o
m´s al proceso oscureci´ndolo un poco.
  a                      e                                   el presente art´
                                                                            ıculo se pretende facilitar el uso
www.xcingenieria.com                ´
                                                    Pagina:     8 de 10
 T´
  ıtulo:        Compilar un programa. . . .         Fecha:      27 de julio de 2012
 Apartado:      7 CONCLUSION ´                            ´
                                                    Revision:   0


de software libre distribuido en forma de c´di-
                                             o
go fuente a personas cuyos conocimientos sobre
programaci´n son escasos.
             o
   Si adem´s sirve para que alguna de esas per-
            a
sonas se anime a colaborar en proyectos de soft-
ware libre o a iniciar el suyo propio el objetivo
estar´ sobradamente cumplido.
      a
   Si alguien desea hacer alg´n comentario o su-
                             u
gerencia puede escribirme a la direcci´n:
                                       o
l.perez@xcingenieria.com.
www.xcingenieria.com                               ´
                                                                   Pagina:       9 de 10
 T´
  ıtulo:        Compilar un programa. . . .                        Fecha:        27 de julio de 2012
 Apartado:      REFERENCIAS                                              ´
                                                                   Revision:     0




Figura 1: Lenguaje de m´quina del Intel 8088. El c´digo de m´quina en hexadecimal se resalta
                          a                        o          a
en rojo, el equivalente en lenguaje ensamblador en magenta, y las direcciones de memoria donde
se encuentra el c´digo, en azul. Abajo se ve un texto en hexadecimal y ASCII (tomada de la
                  o
referencia [1]).




                Figura 2: Dependencias del c´digo de un programa de ordenador.
                                            o


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 (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>.
www.xcingenieria.com                          ´
                                                          Pagina:      10 de 10
T´
 ıtulo:     Compilar un programa. . . .                   Fecha:       27 de julio de 2012
Apartado:   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.

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

  • 1.
    Introducci´n a lacompilaci´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 o 2. 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 palabra 3. 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. o 5. 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 o 7. 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.
    www.xcingenieria.com ´ Pagina: 2 de 10 T´ ıtulo: Compilar un programa. . . . Fecha: 27 de julio de 2012 Apartado: 2 COMPILACION ´ ´ Revision: 0 rre sobre un s´lo tipo de m´quina (por ejemplo o a 2. Compilaci´n o OS X y Mac) es relativamente sencillo generar un ejecutable v´lido para dichas m´quinas y un a a Compilar, en nuestro contexto, consiste en programa de instalaci´n que se encargue de co- o «traducir» el c´digo fuente escrito en un len- o locar el archivo ejecutable y otros archivos que guaje de alto nivel (C, C++, Fortran,. . . ) a una sean 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). a programa se pueda instalar en una familia de Para hacerse una idea de qu´ aspecto tiene el e m´quinas tan amplia como sea posible la solu- a lenguaje de m´quina puede examinarse la figura a ci´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 o tecturas 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 sistema mos 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 es demasiado complicada en la mayor parte de los como el nombre del archivo lleva la extensi´n o casos 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 o tribuci´n de muebles para justificar que sea el o Python la extensi´n «py»,. . . ). Por otra par- o cliente el que tenga que transportarlos hasta su te como en el programa se define la funci´n o casa 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 o te 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 o programa 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 a el programa de aquella en la que se cre´ el mismo. Por o esfuerzo se puede averiguar (aunque en general ejemplo si se intenta compilar un programa dise˜ ado n para Unix en una m´quina Windows el dolor de cabeza no ser´ necesario) que en un sistema Debian Li- a a est´ pr´cticamente garantizado. a a nux versi´n 6 esto implica usar la biblioteca de o
  • 3.
    www.xcingenieria.com ´ Pagina: 3 de 10 T´ ıtulo: Compilar un programa. . . . Fecha: 27 de julio de 2012 Apartado: 2 COMPILACION ´ ´ Revision: 0 funciones «LibCXX 3.4» que forma parte del Ahora el proceso para generar el ejecutable sistema operativo. un poco m´s complicado. Primero deberemos a As´ que el programa hola.cc est´ formado ı a compilar la biblioteca de funciones. Para ello por un unico archivo y (en mi sistema) s´lo usa ´ o teclear´ ıamos: la biblioteca de funciones LibCXX versi´n 3.4. o Si el lector usa alguna variante de Unix y quiere g++ -c bibHola.cc -o bibHola.o compilar este programa, con el compilador de GNU, 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 hola grama 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 que contendr´ 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 como biblioteca en el que se declara una sola funci´n o evaluar funciones trigonom´tricas4 , logaritmos, e a 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 USB funci´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 funciones void 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 a chivo 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 o in 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- a pring_msg de nuestra raqu´ıtica biblioteca de po PC les resultar´ familiar el t´rmino «coprocesador a e funciones «bibHola». matem´tico» que populariz´ Intel en los a˜os 80. a o n
  • 4.
    www.xcingenieria.com ´ Pagina: 4 de 10 T´ ıtulo: Compilar un programa. . . . Fecha: 27 de julio de 2012 Apartado: 2 COMPILACION ´ ´ Revision: 0 2.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 a de lo que se intenta describir en este apartado pondremos 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 grama ta funci´n podr´ recibir como argumentos las o ıa En lo que sigue se supone que tratamos de coordenadas x e y del p´ ıxel en cuesti´n y los o 5 compilar un programa que se cre´ y prob´ con o o valores RGB . Su declaraci´n en C++ ser´ se- o ıa ´xito en otra m´quina y por tanto est´ libre e a a mejante a esta: de errores sint´cticos. Dicho de otro modo, los a in 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 a llamada a esta funci´n como, por ejemplo, la o el programa y aquella en la que se desarroll´ y o siguiente: 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 cabecera 0 . 5 , 0 . 5 , 0 . 5 ) ; // g r i s . Para que el compilador pueda generar el c´-o generar´ las instrucciones del microprocesador digo que servir´ para llamar a las funciones de a a que 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- o ci´n tendremos, por cada uno de los archivos o riables de la biblioteca de funciones a la que fuente 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 o de biblioteca intercaladas. Estos archivos suelen recibe argumentos y devuelve un entero largo tener 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 ıa color rojo (red: R), verde (green: G) y azul (blue: B) 7 Como se ha dicho anteriormente, compilar bajo que 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- ıcil taci´n polaca inversa (RPN) ya saben lo que es una o tremadamente simple o el desarrollador previera dicha pila, 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.
    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 indicar unsigned 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- o Cuadro 1: Ejemplo de archivo de cabecera (muy torio en el que se encuentran los archivos de peque˜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 o la llamada) el compilador puede establecer la Si adem´s necesit´ramos emplear otro archi- a a correspondencia entre los argumentos en la lla- vo de cabecera que estuviera en el directorio mada y en la declaraci´n. Tambi´n puede esta- o e /usr/local/include. blecer la correspondencia entre el valor devuelto por 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 becera vos (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 el do la biblioteca cuya interfaz8 definen (paquete fichero o el directorio binario, 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 o este problema, para que el compilador pueda 1. Realmente el archivo blas.h no est´ ins- a acceder a determinado archivo de cabecera es talado en el sistema. Para cerciorarnos de necesario 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 puede que queremos compilar un programa que hace averiguarse empleando el comando: uso de la biblioteca OpenGL y para ello llama a 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 utilidad puede llamar a las distintas rutinas de la biblioteca a la que 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 e biblioteca. archivo.
  • 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- o 3. 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 que programa, para generar el c´digo ejecutable, se o contiene los binarios correspondientes tenga el deber´ colocar en el sitio adecuado el c´digo eje- a o mismo nombre precedido del prefijo lib. Por cutable de las funciones de biblioteca a las que ejemplo las funciones declaradas en el archivo llamamos. A esta operaci´n se la llama enlazar. o de cabecera gmp.h est´n definidas en el archivo a Cuando el c´digo de las funciones de bibliote- o libgmp.a ´ libgmp.so. Cuando esto no sucede o ca se incorpora al programa ejecutable decimos as´ es necesario consultar la documentaci´n de ı, o que en enlace es est´tico. Por el contrario cuan- a la implementaci´n de la biblioteca en cuesti´n o o do lo que se coloca en el programa ejecutable es en nuestro sistema. el c´digo necesario para ejecutar el c´digo de la o o funci´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 termina su tarea obtendremos un archivo que conten- Como en el caso de los archivos de cabecera dr´ un programa ejecutable. Estos archivos no a cuando el enlazador no encuentra el archivo de suelen tener extensi´n en los sistemas Unix y o biblioteca emite un mensaje de error como el tienen 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 e 3.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- e que se almacena el c´digo ejecutable de las fun- o cuentra. En el primer caso la soluci´n consistir´ o a ciones que componen la misma. En los sistemas en averiguar si la instalaci´n de la biblioteca es o Linux 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 se de versi´n) cuando es una biblioteca de enlace o encuentra el archivo mediante la opci´n -L.o din´mico. En los sistemas Windows las bibliote- a Por ejemplo si se encuentra en /usr/local/lib cas de enlace din´mico tienen la extensi´n .dll a o agregar´ıamos este directorio al comando que y las de enlace est´tico la extensi´n .lib. a o lanza la compilaci´n del programa. o
  • 7.
    www.xcingenieria.com ´ Pagina: 7 de 10 T´ ıtulo: Compilar un programa. . . . Fecha: 27 de julio de 2012 Apartado: 7 CONCLUSION ´ ´ Revision: 0 gcc -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 lo cuando se emplean sistemas de compilaci´n in- o que ser refiere a las bibliotecas que emplea y tegrados 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 las 4. 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 o uso com´ n, sobre todo en entornos Unix, que u el desarrollador en CMakeLists.txt. El olvido sirve para automatizar la generaci´n de progra- o de alguna biblioteca necesaria para compilar el mas ejecutables y bibliotecas a partir del c´digo o programa dar´ lugar al correspondiente error. a fuente. A tal fin se escribe un archivo denomina- Llegados a este punto cabe modificar el archivo do «makefile» en el que se especifican las reglas CMakeLists.txt para subsanar el error si se a seguir para obtener el c´digo fuente. Como o tienen conocimientos para hacerlo ´ indicar al o ejemplo mostramos aqu´ el archivo makefile ı desarrollador el mensaje de error obtenido para que 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 a bi 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 o clean : 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. a informaci´n sobre esta herramienta. o 6. Las instrucciones de 5. 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- a generaci´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 programa blioteca. Para ello est´n dotados de una serie de a en ambiente Unix resultar´ m´s sencillo inter- a a rutinas 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 a los 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 o ridades de los distintos sistemas operativos. Su principal desventaja es que a˜aden una capa n Con la informaci´n que se proporciona en o m´s al proceso oscureci´ndolo un poco. a e el presente art´ ıculo se pretende facilitar el uso
  • 8.
    www.xcingenieria.com ´ Pagina: 8 de 10 T´ ıtulo: Compilar un programa. . . . Fecha: 27 de julio de 2012 Apartado: 7 CONCLUSION ´ ´ Revision: 0 de software libre distribuido en forma de c´di- o go fuente a personas cuyos conocimientos sobre programaci´n son escasos. o Si adem´s sirve para que alguna de esas per- a sonas se anime a colaborar en proyectos de soft- ware libre o a iniciar el suyo propio el objetivo estar´ sobradamente cumplido. a Si alguien desea hacer alg´n comentario o su- u gerencia puede escribirme a la direcci´n: o l.perez@xcingenieria.com.
  • 9.
    www.xcingenieria.com ´ Pagina: 9 de 10 T´ ıtulo: Compilar un programa. . . . Fecha: 27 de julio de 2012 Apartado: REFERENCIAS ´ Revision: 0 Figura 1: Lenguaje de m´quina del Intel 8088. El c´digo de m´quina en hexadecimal se resalta a o a en rojo, el equivalente en lenguaje ensamblador en magenta, y las direcciones de memoria donde se encuentra el c´digo, en azul. Abajo se ve un texto en hexadecimal y ASCII (tomada de la o referencia [1]). Figura 2: Dependencias del c´digo de un programa de ordenador. o 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 (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.
    www.xcingenieria.com ´ Pagina: 10 de 10 T´ ıtulo: Compilar un programa. . . . Fecha: 27 de julio de 2012 Apartado: 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.