Este documento introduce los conceptos básicos de la compilación de programas en Unix. Explica que la compilación traduce el código fuente de alto nivel a instrucciones de máquina y consta de dos pasos: compilación y enlace. También describe la estructura típica de un programa y sus bibliotecas de funciones, e ilustra el proceso de compilación con un ejemplo sencillo.
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Introducción a la compilación en ambientes Unix.
1. Introducci´n a la compilaci´n en ambiente Unix
o o
Luis C. P´rez Tato
e
27 de julio de 2012
´
Indice 1. Introducci´n
o
Este art´ıculo se redacta pensando en aque-
1. Introducci´n
o 1 llas personas que tienen conocimientos de in-
1.1. ¿Porqu´ tengo que compilar el
e form´tica a nivel de usuario y desean aprender
a
programa? . . . . . . . . . . . . . 1 a compilar e instalar programas que se distri-
buyen en forma de c´digo fuente. En particular
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.