Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Compilacion PDF
Compilacion PDF
on separada
Gabriel Navarro
Metodologa de la Programacion
Grado en Ingeniera Informatica
Gabriel Navarro
Compilaci
on separada
Indice
Motivacion
Division en varios ficheros
El proceso de compilaci
on
El preprocesador
El compilador
El enlazador
Sintaxis del compilador g++
Gabriel Navarro
Compilaci
on separada
Motivacion
Si tenemos un proyecto de varios millones de lneas de c
odigo
en un solo fichero, podemos tener algunos problemas:
Para encontrar componentes del programa
Para corregir errores en el c
odigo
Para comprobar si alg
un m
odulo esta correctamente
implementado
Para modificar el programa
Para reutilizar algunas partes del programa en otro
Para trabajar en equipo al implementarlo
Para ocultar la implementaci
on de algunas componentes
Para dar la documentaci
on a los usuarios
Gabriel Navarro
Compilaci
on separada
Motivacion
Una solucion es dividir el c
odigo en varios archivos de codigo
fuente y compilar cada uno por separado:
Al estar mas ordenado
Mas facil encontrar los errores
Mas sencillo modificar el programa
Gabriel Navarro
Compilaci
on separada
Inclusi
on de bibliotecas, por ejemplo #include<iostrem>
Espacio de nombres, normalmente using namespace std;
Constantes y variables globales
Tipo de datos definidos por el usuario, struct Hora {....};
Prototipos de las funciones
Funci
on main
Definiciones de las funciones
Gabriel Navarro
Compilaci
on separada
Compilaci
on separada
funciones_n.cpp
nombres
ctes. globales
main.cpp
tipos de datos
prototipos
main
Gabriel Navarro
Compilaci
on separada
Gabriel Navarro
Compilaci
on separada
Gabriel Navarro
Compilaci
on separada
Bibliotecas
#include "funciones_i.h"
funciones_1.cpp
funciones_1.h
tipo_1.h
#include "tipo_i.h"
Espacio nombres
Ctes globales
main
main.cpp
Gabriel Navarro
Compilaci
on separada
CUIDADO
En C++, todos los objetos deben ser declarados y definidos antes
de ser usados. Por eso hay que tener cuidado donde se utiliza la
directiva include en el fichero principal
CUIDADO
No hay una u
nica manera eficiente de distribuir el codigo, depende
del uso que queramos darle
Gabriel Navarro
Compilaci
on separada
Compilaci
on separada
Proceso de compilacion
c
odigo
c
odigo
fuente
objeto
.cpp
.o
c
odigo
preprocesador
fuente
c
odigo
compilador
.cpp
objeto
enlazador
.o
c
odigo
c
odigo
fuente
objeto
.h
.o
gestor bib.
biblio.
.a
Construcci
on de biliotecas
Gabriel Navarro
Compilaci
on separada
ejecutable
Proceso de compilacion
Importante
Los u
nicos ficheros que se compilan son .cpp
La documentacion del programa se realiza en los ficheros .h
Ocultamiento del software
Al dividir el codigo de esta forma podemos ocultar la
implementacion de un algoritmo al usuario:
El usuario recibe el fichero compilado .o (ilegible para una
persona) para que pueda utilizar el algoritmo
El usuario recibe la documentaci
on en el fichero de cabecera
.h para que sepa c
omo utilizarlo
El fichero .cpp no es necesario para el usuario
Gabriel Navarro
Compilaci
on separada
Proceso de compilacion
Gabriel Navarro
Compilaci
on separada
El preprocesador
Preprocesador
El preprocesador es una herramienta que filtra el codigo fuente y lo
prepara para ser compilado
Elimina los comentarios
Procesa las directivas de preprocesamiento, que son las
que empiezan por #
Por ejemplo, #include <iostream>
Recibe ficheros de texto (.cpp y .h)
Devuelve fichero de texto (.cpp)
En este proceso es cuando se utilizan los ficheros de
cabecera
Gabriel Navarro
Compilaci
on separada
El preprocesador
Directiva include
La directiva #include hace que se incluya el contenido del fichero
especificado en la posici
on en la que se encuentra la directiva
Ejemplo
#include <iostream>
#include "fichero.h"
Dos formas de especificar el fichero
Entre < y >. Busca el fichero en el directorio de ficheros de
cabecera del sistema o en el que se indique en la compilacion
Entre comillas. Busca el fichero en el directorio donde se
realiza la compilaci
on
Gabriel Navarro
Compilaci
on separada
El preprocesador
Fichero funciones.h
char bienvenida (int n);
int contar (char p);
Fichero main.cpp
#include <iostream>
#include funciones.h
using namespace std;
int main(){
int n=3;
cout << contar (bienvenida(n));
}
include es lo mismo que copiar y pegar
Gabriel Navarro
Compilaci
on separada
El preprocesador
Directiva define
La directiva #define se emplea para definir constantes simbolicas
#define identificador textosustituci
on
Ejemplo
#define MAXLONG 256
la directiva sustituye las apariciones de MAXLONG por 256. Funciona
como buscar y reemplazar
Ejemplo
#define CONST
define una constante CONST pero no sustituye nada, se utiliza para
marcar si hemos realizado un proceso
Gabriel Navarro
Compilaci
on separada
El preprocesador
Directiva undef
La directiva #undef anula una definici
on previa
#undef identificador
Ejemplo
#undef MAXLONG
elimina la definicion previa de MAXLONG, una vez hecho esto se
puede asociar a la variable una nueva definici
on
Gabriel Navarro
Compilaci
on separada
El preprocesador
Inclusion condicional de c
odigo
Existe la posibilidad de incluir c
odigo de forma condicional
mediante las directivas #if, #else, #elif, #endif, #ifdef,
#ifndef
Vamos a utilizar estas directivas para evitar la doble inclusi
on de
ficheros de cabecera
Gabriel Navarro
Compilaci
on separada
El preprocesador
Fichero DNI.h
struct DNI{
char numero[8];
char letra;
};
Fichero PERSONA.h
#include DNI.h
struct PERSONA{
char nombre[45];
DNI documento;
};
Gabriel Navarro
Compilaci
on separada
El preprocesador
Fichero main.cpp
#include DNI.h
#include PERSONA.h
int buscar (DNI m, PERSONA * m);
int main(){
............
............
};
Gabriel Navarro
Compilaci
on separada
El preprocesador
Fichero main.cpp (despues del preprocesador)
struct DNI{
char numero[8];
char letra;
};
struct DNI{
char numero[8];
char letra;
};
struct PERSONA{
char nombre[45];
DNI documento;
}; int buscar (DNI m, PERSONA * m);
int main(){...........};
Doble definici
on del tipo de dato DNI
Gabriel Navarro
Compilaci
on separada
El preprocesador
Para evitar esta transitividad, los ficheros de cabecera tendran el
siguiente formato
Fichero cabecera.h
#ifndef CABECERA_H // si no se ha incluido, es decir,
// si no se ha definido la constante
#define CABECERA_H // incl
uyelo, es decir, define la constante
.
.
. // contenido del fichero de cabecera
.
.
#endif // final del condicional
Gabriel Navarro
Compilaci
on separada
El compilador
Compilador
el compilador tiene como objetivo analizar la sintaxis y la
semantica del codigo fuente preprocesado y traducirlo a codigo
objeto (codigo maquina)
Recibe un fichero fuente (texto)
Devuelve un fichero objeto (c
odigo maquina) con extension .o
Normalmente, al llamar al compilador, se preprocesa y se
compila
c
odigo
fuente
c
odigo
preprocesador
.cpp
fuente
c
odigo
compilador
.cpp
Gabriel Navarro
Compilaci
on separada
objeto
.o
El enlazador
Enlazador
el enlazador tiene como objetivo resolver las referencias a objetos
externos, es decir, realizar las llamadas a objetos contenidos en
otros ficheros previamente compilados
Diagrama
Supongamos que main.cpp hace una llamada a una funcion en
func.cpp
main.cpp
compilador
main.o
func.cpp
compilador
func.o
Gabriel Navarro
enlazador
Compilaci
on separada
main
El enlazador
Comentarios
En este proceso es cuando se utilizan las bibliotecas
El enlazador enlaza ficheros .o, en particular, los contenidos
en una biblioteca
No haremos una llamada al enlazador, se llamara al
compilador para que tambien enlace
Para que el enlazador construya el fichero ejecutable es
necesario que, entre los ficheros .o, uno contenga la funcion
main
Gabriel Navarro
Compilaci
on separada
Gabriel Navarro
Compilaci
on separada
Ejemplo
g++ -o juego main.cpp
g++ -o juego.exe main.cpp
Gabriel Navarro
Compilaci
on separada
Gabriel Navarro
Compilaci
on separada
Gabriel Navarro
Compilaci
on separada
Construccion de bibliotecas
Biblioteca
Una biblioteca es un fichero que contiene un conjunto de ficheros
objeto .o
Tiene extension .a
Esta escrito en codigo maquina
Evita la repeticion de c
odigo, menos volumen de codigo
Ayuda a compartir funciones ocultando el c
odigo fuente
Ayuda a simplificar el c
odigo fuente
sumar.o
mul
t.o
operaciones.a
restar.o
Gabriel Navarro
Compilaci
on separada
Construccion de bibliotecas
sumar.cpp
compilador
sumar.o
restar.cpp
compilador
restar.o
mult.cpp
compilador
mult.o
Gabriel Navarro
gestor bib.
Compilaci
on separada
oper.a
Construccion de bibliotecas
Nota
Cada modulo de una biblioteca es un fichero .o que puede
contener mas de una funci
on. Pero es mas eficiente, en espacio,
que cada funcion se implemente en un fichero .cpp distinto
Ejemplo
Biblioteca libmov.a con dos funciones: subir y bajar
Modo 1: libmov.a con un m
odulo: subirbajar.o
Modo 2: libmov.a con dos m
odulos: subir.o y bajar.o
Supongamos que main s
olo utiliza la funci
on subir
Tama
no ejecutable modo 1: 5234 bytes
Tama
no ejecutable modo 2: 3136 bytes
La biblioteca s
olo utiliza los m
odulos que necesita!!!
Gabriel Navarro
Compilaci
on separada
Construccion de bibliotecas
Gabriel Navarro
Compilaci
on separada
Construccion de bibliotecas
Gestor de bibliotecas ar
ar es el gestor de bibliotecas de GNU
Sintaxis de ar
ar -[opci
on] [modificadores] biblioteca [ficheros_objeto]
Opcion r, a
nade, o reemplaza si ya exista alguno, los ficheros
objeto en la biblioteca. Si no existe la biblioteca, la crea
Opcion d, elimina los ficheros objeto de la biblioteca
Opcion x, extrae el fichero objeto de la biblioteca
Opcion t, lista los ficheros objeto en la biblioteca
Modificador s, crea un ndice de los ficheros objeto, necesario
para el enlazado
Modificador v, muestra las operaciones realizadas
Gabriel Navarro
Compilaci
on separada
Gabriel Navarro
Compilaci
on separada
Opcion -l
-lnombre_biblioteca
se
nala al compilador que utilice los m
odulos de la biblioteca
libnombre_biblioteca.a
es posible utilizarlo varias veces para a
nadir varias bibliotecas
Ejemplo
g++ -o juego juego.cpp -L /lib -loper
g++ -o juego juego.cpp -L /lib -loper -lmenu
Gabriel Navarro
Compilaci
on separada
Ficheros makefile
Gabriel Navarro
Compilaci
on separada
Motivacion
Supongamos que queremos realizar un proyecto que cuenta con los
siguientes ficheros de c
odigo fuente .cpp:
subir.cpp, bajar.cpp, izquierda.cpp, derecha.cpp
conteniendo funciones para crear una biblioteca libmov.a
presenta.cpp, resul.cpp, opcion.cpp conteniendo
funciones para crear una biblioteca libmenu.a
imagen.cpp conteniendo la implementaci
on de la clase
imagen
main.cpp con la funci
on main
Ejercicio
Que ordenes hacen falta para compilar todo el proyecto?
Gabriel Navarro
Compilaci
on separada
Motivacion
subir.cpp
subir.o
bajar.cpp
bajar.o
izquierda.cpp
izquierda.o
derecha.cpp
derecha.o
presenta.cpp
presenta.o
resul.cpp
resul.o
opcion.cpp
opcion.o
imagen.cpp
imagen.o
main.cpp
main.o
libmov.a
Gabriel Navarro
libmenu.a
Compilaci
on separada
juego
Motivacion
Solucion
g++ -c subir.cpp
g++ -c bajar.cpp
g++ -c izquierda.cpp
g++ -c derecha.cpp
ar -rsv libmov.a subir.o bajar.o izquierda.o derecha.o
g++ -c presenta.cpp
g++ -c resul.cpp
g++ -c opcion.cpp
ar -rsv libmenu.a presenta.o resul.o opcion.o
g++ -c imagen.cpp
g++ -c main.cpp
g++ -o juego main.o imagen.o -lmov -lmenu
Gabriel Navarro
Compilaci
on separada
Motivacion
Problema
Al realizar alg
un cambio, necesitaremos compilar parte del proyecto
Ejemplo
Si se realizan cambios en imagen.cpp...
g++ -c imagen.cpp
g++ -o juego main.o imagen.o -lmov -lmenu
...y en todas las funciones que utilicen la clase...
...y las bibliotecas de las que forman parte...
Si el proyecto es grande, compilar as es poco eficiente
Gabriel Navarro
Compilaci
on separada
Motivacion
Una solucion
Guardar las ordenes en un fichero
Ficheros makefile
Un fichero makefile es un fichero de texto donde se guardan las
ordenes de compilacion de un proyecto
Programa make
El programa make es una aplicaci
on que lee ficheros makefile y
ejecuta las ordenes escritas en el
Aqu trataremos el programa make de GNU y la construccion de
ficheros makefile para ser ledos por el
Gabriel Navarro
Compilaci
on separada
Ficheros makefile
Sintaxis basica
Los comentarios van precedidos de #
Cada accion que queramos realizar tiene el formato
destino : [dependencias]
[tabulador]orden1
[tabulador]orden2
[tabulador]orden3
.......
[tabulador]ordenM
destino es un identificador de la lista de ordenes a realizar
las dependencias son otros destinos que hacen falta para
realizar destino
Gabriel Navarro
Compilaci
on separada
Ficheros makefile
Gabriel Navarro
Compilaci
on separada
Ficheros makefile
Normalmente se divide en procesos mas peque
nos,
Gabriel Navarro
Compilaci
on separada
Ficheros makefile
Otro ejemplo,
Gabriel Navarro
Compilaci
on separada
Ficheros makefile
Sintaxis del programa make
make -[opciones] [destinos]
destinos son los destinos que queremos que se realicen del
fichero makefile
Si no a
nadimos ning
un destino, intentara realizara solo el
primero y los destinos de los que dependa
Si falla al construir un destino, se detiene el proceso y borra el
destino
Opciones:
-h, muestra la ayuda del programa
-f nom_fich, indica que el fichero makefile tiene por nombre
nom_fich. Si no se indica, buscara un fichero con nombre
makefile o Makefile
-n muestra las instrucciones que se ejecutaran, sin ejecutarlas
Gabriel Navarro
Compilaci
on separada
Ficheros makefile
Ejemplos de lo mismo
make
make -f makefile
make -f Makefile
Ejemplos
make
make
make
make
make
-f makefil.mak imagen.o
-f makefil.txt imagen.o mov
mov menu
-n menu
-h
Gabriel Navarro
Compilaci
on separada
Ficheros makefile
Propiedad
SOLO
si el fichero destino es mas reciente que el fichero fuente, el
programa make reconstruira el fichero destino
Gabriel Navarro
Compilaci
on separada
Ficheros makefile
Prefijos en las ordenes de un fichero makefile
Prefijo @
@g++ -c subir.cpp
No muestra la orden por pantalla, pero s la ejecuta
Gabriel Navarro
Compilaci
on separada
Ficheros makefile
Gabriel Navarro
Compilaci
on separada
Ficheros makefile
Destinos simbolicos
Un destino simbolico es un destino que agrupa varios destinos
diferentes
No tiene ordenes y la lista de dependencias son los destinos a
agrupar
Se realizan para simplificar la llamada al programa make
Gabriel Navarro
Compilaci
on separada
Ficheros makefile
Gabriel Navarro
Compilaci
on separada
Ficheros makefile
Gabriel Navarro
Compilaci
on separada
Ficheros makefile
Macros
Una macro es una cadena que se expande cuando se llama desde
un fichero makefile
Sintaxis
NOMBRE = cadena
NOMBRE es el identificador de la macro. Sin espacios en
blanco. Suele escribirse en may
usculas
cadena es la cadena a expandir
La llamada a la macro se hace de la forma $(NOMBRE)
Gabriel Navarro
Compilaci
on separada
Ficheros makefile
Gabriel Navarro
Compilaci
on separada
El depurador gdb
Gabriel Navarro
Compilaci
on separada
Motivacion
Gabriel Navarro
Compilaci
on separada
Motivacion
Depurador
Un depurador permite establecer pausas en la ejecucion de un
programa, seguir el valor de las variables durante esas pausas,
cambiar su valor sobre la marcha, etc.
Paso previo
Para poder utilizar el depurador es necesario enlazar el ejecutable
con la opcion -g del compilador g++
Gabriel Navarro
Compilaci
on separada
gdb
gdb
gdb es el depurador de c
odigo de GNU
Para inicializarlo, escribimos gdb nombre_ejecutable en la
consola, donde nombre_ejecutable es el fichero ejecutable
obtenido al compilar con la opci
on -g
Gabriel Navarro
Compilaci
on separada
Ordenes
basicas
Gabriel Navarro
Compilaci
on separada
Ordenes
basicas
run
run comienza la ejecuci
on del programa
run arg comienza la ejecuci
on con el argumento arg
Gabriel Navarro
Compilaci
on separada
Ordenes
basicas
Los puntos de parada son puntos en el c
odigo fuente donde gdb se
para y permite ejecutar otras opciones.
break
break lin pone un punto de parada en la lnea lin
break fun pone un punto de parada al comienzo de la
funcion fun
break clase::fun, o al comienzo de una funcion miembro
Gabriel Navarro
Compilaci
on separada
Ordenes
basicas
info
info breakpoints muestra los puntos de parada
Gabriel Navarro
Compilaci
on separada
Ordenes
basicas
delete
delete breakpoints NUM elimina el punto de parada
n
umero NUM
Gabriel Navarro
Compilaci
on separada
Ordenes
basicas
continue
continue continua la ejecuci
on del programa
Gabriel Navarro
Compilaci
on separada
Ordenes
basicas
list
list muestra las siguientes 10 lneas del c
odigo
Gabriel Navarro
Compilaci
on separada
Ordenes
basicas
quit
quit abandona el programa depurador
Gabriel Navarro
Compilaci
on separada
Ordenes
basicas
print
print EXP muestra el valor de la expresi
on EXP en tiempo de
ejecucion.
Gabriel Navarro
Compilaci
on separada
Ordenes
basicas
set
set asigna un valor a una variable o expresi
on.
Gabriel Navarro
Compilaci
on separada
Ordenes
basicas
step
step ejecuta la siguiente linea de c
odigo
next es igual que step pero si contiene una llamada a una
funcion, ejecuta la llamada completamente
Gabriel Navarro
Compilaci
on separada
Ordenes
basicas
watch
watch VAR marca la variable VAR e interrumpe el programa
cuando cambia su valor
Gabriel Navarro
Compilaci
on separada
Ordenes
basicas
help
help COM muestra la ayuda sobre el comando COM.
Gabriel Navarro
Compilaci
on separada