Compilazione separata. Come realizzare correttamente un piccolo progetto su piu' file

Documenti analoghi
Compilazione separata. Come realizzare correttamente un piccolo progetto su piu' file

Programmazione I - Laboratorio

Compilazione separata

Primo passo: il preprocessor. Il preprocessore. Esempi di direttive al preprocessore: #include. Esempi di direttive al preprocessore: #define

Preprocessing, compilazione ed esecuzione. Utilizzando strumenti GNU...

PROGETTI SU PIU` FILE

Lezione 10: Librerie e compilazione separata

Perché il linguaggio C?

Laboratorio reti AA 2008/2009. Dott. Matteo Roffilli Ricevimento in ufficio dopo la lezione

Perché il linguaggio C?

STRUTTURA DI UN PROGRAMMA

prova.c #include <stdio.h> char funzione(char); codice oggetto del main()

Introduzione a Visual Studio 2005

Esempio. Le istruzioni corrispondono a quelle di sopra, ma sono scritte in modo simbolico. E indipendente dalla machina

STRUTTURA DI UN PROGRAMMA!

MS Visual Studio: Linea di Comando

Esercitazione. Uso di funzioni e librerie di funzioni

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 4 24/10/2013

Preprocessore, linker e libreria standard

Il sistema C è formato dal linguaggio C, dal preprocessore, dal compilatore, dalle librerie e da altri strumenti di supporto.

Debug di un programma

Progetti su più File Sorgenti

Primi passi col linguaggio C

deve conoscerne solo l interfaccia:

Introduzione al linguaggio C. Emilio Di Giacomo

f2.obj compilatore compilatore linker f3.obj compilatore

Compilazione e Makefile

Classi di memorizzazione

Unità Didattica 1 Linguaggio C. Fondamenti. Struttura di un programma.

Linea di comando. Compilazione. Aprire una shell di DOS tramite:

Passaggio dei parametri

Ambienti di Programmazione per il Software di Base

Testi consigliati. Laboratorio di Algoritmi e Strutture Dati. Compilatore

Linguaggio C - panoramica

Breve Riepilogo del Linguaggio C

Dati due punti sul piano calcolare la loro distanza

LA RICORSIONE IN C. CdL Ingegneria Informatica n.o. Anno Accademico 2006/07 Fondamenti di Informatica I corso A Giacomo Piscitelli pag.

Unità Didattica 3 Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

TUTORATO di LINGUAGGI I

Laboratorio di Calcolo Linguaggi di programmazione

Un codice sorgente. Introduzione alla compilazione automatica: Make e Makefile. Generazione di un programma eseguibile. Un codice sorgente

Linguaggi Compilati vs. Interpretati

Lezione 5: Introduzione alla programmazione in C

IL PRIMO PROGRAMMA IN C

Primi passi Output formattato Le quattro operazioni. Programmazione 1. Lezione 2 Parte 2. Vincenzo Marra.

Preprocessore (cpp) Compilatore (gcc)

Linguaggio C. Appunti per il corso di Laboratorio di Algoritmi e Strutture Dati. Stefano Aguzzoli

Introduzione alla programmazione in C

Il preprocessore. Direttiva define Direttiva include Direttiva if

Il linguaggio C. Il preprocessore...

Introduzione a. Funzioni di Ingresso e Uscita. Compilazione

Programmazione di base

perror: individuare l errore quando una system call restituisce -1

Le direttive del Preprocessore

COSTRUZIONE DI UN APPLICAZIONE

Esiste però anche un ambiente globale: quello dove tutte le funzioni sono definite. Qui si possono anche definire variabili, dette variabili globali

Esiste però anche un ambiente globale: quello dove tutte le funzioni sono definite. Qui si possono anche definire variabili, dette variabili globali

Introduzione al C. Unità 10 Preprocessore. D. Bloisi, S. Peluso, A. Pennisi, S. Salza

Unix e comandi di base

Struttura dei programmi e Variabili

I puntatori. Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore

Kernel and User space

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

Input/Output di numeri

Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

Linguaggi di Programmazione

Università degli Studi di Ferrara

LP1 Lezione 11: Librerie Personali. Maurizio Tucci

Programmazione di base

DIRETTIVE DI PREPROCESSORE

Informazioni Utili. Fondamenti di Informatica L-B (L-Z) Esercitazioni. A.A. 2005/06 Tutor: Loris Cancellieri

Fabio Scotti ( ) Laboratorio di programmazione per la sicurezza. Valentina Ciriani ( ) Laboratorio di programmazione

La direttiva #include

Struttura di un. Struttura dei programmi C

Introduzione alla compilazione ed esecuzione di programmi C con IDE Dev-C++

Fondamenti di Informatica. Ingegneria elettronica

Primo programma in C

Il processo di compilazione. dalle note del prof. Oliver Fringer

1 PANORAMICA SUL LINGUAGGIO C

Introduzione alla Programmazione in C

Passaggio dei parametri Per valore Il valore viene copiato dall environment esterno all environment della funzione o procedura Cambiamenti dei paramet

#include <stdio.h> main() { - 1 -

La programmazione in linguaggio C

Programmazione in C. La struttura del programma Variabili, espressioni, operazioni

Introduzione al linguaggio C Primi programmi

Laboratorio di Informatica I

Il compilatore Dev-C++

Linguaggio C: introduzione

Makefile. Il file dependency system di Unix (serve ad automatizzare il corretto aggiornamento di più file che hanno delle dipendenze)

Lo scopo. Il primo esperimento. Soluzione informale. Le variabili

Strutture di Controllo Iterative: Istruzioni While e Do

Linguaggio di Riferimento: C

Introduzione al C. Introduzione. Linguaggio ad alto livello. Struttura di un programma C

Fondamenti di Informatica L-B (L-Z) Esercitazioni. A.A. 2007/08 Tutor: Barbara Pettazzoni

Transcript:

Compilazione separata Come realizzare correttamente un piccolo progetto su piu' file 1

Programmi C su più file Tutti i programmi che abbiamo visto finora erano composti da un unico file.c Nel caso di programmi più grandi è conveniente suddividere il codice in più file: migliore suddivisione e organizzazione del codice facilità di manutenzione e correzione degli errori possibilità di riutilizzare il codice per progetti diversi 2

Programmi C su più file Il linguaggio C e l ambiente Unix forniscono tre strade per suddividere il codice: 1. inclusione diretta di file sorgente e compilazione unica; 2. inclusione di header file e compilazione separata; 3. Inclusione di header file e uso di librerie statiche o dinamiche. Vediamo i tre casi con un esempio 3

Includo il.c: esempio int somma (int x, int y) { return x + y; } File somma.c #include <stdio.h> #include "somma.c" int main(void) { int a, b, c; scanf("%d %d", &a, &b); c = somma(a,b); printf("%d\n", c); return 0; } File main.c 4

Includo il.c: esempio Per compilare basta usare il comando: gcc Wall pedantic main.c Vediamo cosa succede 1. Preprocessore: sostituisce alle prime due righe del file main.c una copia del contenuto del file stdio.h e una la copia del file somma.c 5

Includo il.c: esempio /* qua la copia di stdio.h*/ int somma (int x, int y) { return x + y; } int main(void) { int a, b, c; scanf("%d %d", &a, &b); c = somma(a,b); printf("%d\n", c); return 0; } File Effettivamente compilato Contiene tutto Il codice della Funzione somma 6

Includo il.c: esempio Per compilare basta usare il comando: gcc Wall pedantic main.c Vediamo cosa succede 1. Preprocessore: sostituisce alle prime due righe del file main.c una copia del contenuto del file stdio.h e una la copia del file somma.c 2. Il compilatore genenera il codice binario sia per la funzione somma() che per il main() esattamente come se avessi scritto tutto in un singolo file dall'inizio 7

Includo il.c: esempio Svantaggi: Devo avere il codice sorgente di tutte le funzioni che uso Se fosse possibile solo questo dovrei avere sempre disponibile il codice di tutte le funzioni di libreria, ad esempio printf(), scanf() Ogni volta devo ricompilare tutto dall'inizio anche se non ho modificato niente 8

Includo il.h: esempio int somma (int x, int y) { return x + y; } File somma.c int somma (int x, int y); File somma.h #include <stdio.h> #include "somma.h" int main(void) { int a, b, c; scanf("%d %d", &a, &b); c = somma(a,b); printf("%d\n", c); return 0; } File main.c 9

Includo il.h: esempio In questo caso non è necessario avere disponibile il codice sorgente della funzione somma ma basta il precompilato (modulo oggetto): Si può creare il modulo oggetto con gcc Wall pedantic c somma.c Questo crea un file somma.o con il precompilato (binario) e poi mettere a disposizione solo somma.h e somma.o a chi ha bisogno della funzione 10

Includo il.h: esempio Supponiamo quindi somma.o e somma.h disponibili e vediamo come compilare il main: Basta creare il modulo oggetto anche per il main gcc Wall pedantic c main.c 1. Questo copia le informazioni del.h all'inizio del file 11

Includo il.h: esempio /* qua la copia di stdio.h*/ int somma (int x, int y); int main(void) { int a, b, c; scanf("%d %d", &a, &b); c = somma(a,b); printf("%d\n", c); return 0; } File Effettivamente compilato Contiene solo l'intestazione della Funzione somma 12

Includo il.h: esempio Supponiamo quindi somma.o e somma.h disponibili e vediamo come compilare il main: Basta creare il modulo oggetto per il main gcc Wall pedantic c main.c 1. Questo copia le informazioni del.h all'inizio del file 2. Con le informazioni sul tipo della funzione il compilatore può controllare che la funzione sia chiamata in modo corretto e creare un modulo oggetto anche per il main main.o 13

Includo il.h: esempio Supponiamo...vediamo come compilare il main: Basta creare il modulo oggetto per il main gcc Wall pedantic c main.c E poi collegarlo al codice del modulo oggetto di somma ed alle librerie (linking) gcc main.o somma.o o ese Le due fasi possono anche essere raggruppate in un unico comando gcc Wall pedantic main.c somma.o o ese 14

Vantaggi: Includo il.h: esempio Non devo avere il codice sorgente di tutte le funzioni che uso (bastano tipi e prototipi nel.h) Ogni volta non devo ricompilare tutto dall'inizio anche se non ho modificato Svantaggi: Se ho molti file.o devo ricordarmi di specificarli tutti altrimenti la compilazione fallisce Soluzione, raggruppare tutti i.o in una libreria (come stdio.h) 15

Includo il.h + libreria: esempio int somma (int x, int y) { return x + y; } File somma.c int somma (int x, int y) File somma.h #include <stdio.h> #include "somma.h" int main(void) { int a, b, c; scanf("%d %d", &a, &b); c = somma(a,b); printf("%d\n", c); return 0; } File main.c 16

Includo il.h + libreria: esempio Anche in questo caso creo il modulo oggetto con gcc Wall pedantic c somma.c E poi creo la libreria libsomma.a ar r libsomma.a somma.o Se avessi più.o potrei metterli tutti nella stessa libreria es: ar r libopint.a somma.o diff.o div.o 17

Includo il.h + libreria: esempio Supponiamo quindi libsomma.a disponibile vediamo come compilare il main: Basta indicare la libreria dove prendere il codice per le funzioni mancanti gcc Wall pedantic main.c L. -lsomma 1. Questo crea il main.o 2. E va a prendere il codice per le funzioni usate ma non definite nei.o delle librerie, sia quelle standard che quelle linkate esplicitamente Basta indicare la cartella e la parte cantrale del nome (tutte le librerie C iniziano per lib e terminano per.a) 18