Compilatori

In UNIX le fasi di compilazione e link (che si avevano anche in VMS) sono organizzate in modo leggermente diverso. Generalmente la fase di link viene attivata automaticamente in sequenza dal compilatore, che si occupa anche dell'eventuale pre-processing del sorgente (via cpp). Nel caso questi automatismi non risultino abbastanza flessibili, conviene usare comandi/programmi appositi (make, gmake).

Qui affrontiamo la compilazione base di programmi Fortran 77, C e C++, ovvero i comandi

  • f77 (g77)
  • cc (gcc)
  • CC (g++)

    Prima di eseguire la compilazione, e' importante verificare quale compilatore si stia per usare (which cc), poiche' non necessariamente tale compilatore ha tutte le estensioni e opzioni necessarie. Questo e' vero soprattutto per cc, che non su tutte le piattaforme e' compatibile ANSI o POSIX (ad es. su HP-UX) (vedi Opzioni aggiuntive).

    Cenni generali

    La sintassi generale del comando e'

    cc(f77)(CC) [options] input_file

    I tre compilatori richiedono che il file da compilare soddisfi alcuni requisiti sull'estensione. Le estensioni piu' usate in HEP che vengono riconosciute dai compilatorisono:

  • f77 (gcc) -> viene eseguito su file del tipo *.f, *.for, *.F, *.FOR
  • cc (gcc) -> viene eseguito su file del tipo *.c, *.C
  • CC (gcc) -> viene eseguito su file del tipo *.cc, *.CC, *.c++

    e producono di default un file eseguibile chiamato a.out

    L'opzione base per dare un nome al file a.out e' -o, quindi, ad es.

    f77 -o mio.exe mio.f

    Include files e librerie

    In generale, i compilatori chiamano automaticamente il loader (ld), che si occupa di fare il link.
    Gli include e le librerie di sistema, se correttamente configurate, vengono automaticamente trovate e linked.
    Quindi, ad esempio, per compilare un semplice programma C che usi

    #include

    basta fare

    cc -o mio.exe mio.c

    Se si devono aggiungere degli include che si trovano in altre directories, si puo' fare con l'opzione -Idir dove dir e' la directory dove si trovano gli altri include.
    Ad esempio:

    f77 -o mio.exe mio.f -I/home/me/includedir


    Analogamente, l'opzione -Ldir consente di aggiungere directory in cui cercare certe librerie. Le librerie vengono poi aggiunte con l'opzione -llibx:

    cc -o mio.exe mio.f -I/home/me/includedir -L/home/me/libdir

    Quindi, una tipica applicazione potrebbe essere la seguente:

    f77 -o mio.exe mio.f -L /usr/lib/X11R5 -L /usr/lib/Motif1.2 -lm -lX11 -lcl -L/cern/97a/lib -lpacklib -lkernlib -lmathlib -lgraflib -lgrafX11 -lX11


    Opzioni aggiuntive

    Debugging e ottimizzazione
    Se si vuole poter lanciare e controllare l'eseguibile da un debugger, accedendo al contenuto delle sue variabili e strutture di dati attraverso la symbol table e' necessario specificarlo con l'opzione -g.

    Quasi tutti i compilatori ottimizzano il codice: a seconda della piattaforma l'ottimizzazione puo' essere piu' o meno spinta. Comunque, e' possibile modificarla con l'opzione -Oi dove i e' un numero intero (0-4) che indica il livello di ottimizzazione.
    Ovviamente, -Oi e -g sono mutuamente esclusive.

    ANSI
    L'essere ANSI o meno del compilatore C dipende dalla piattaforma su cui ci si trova. Qui di seguito sono riportate le opzioni necessarie per alcune piattaforme:

  • HP-UX: specificare ANSI con -Aa (ANSI) o -Ae (extended ANSI)
  • IRIX: di default ANSI
  • SunOs: di default ANSI.
  • Digital Unix pre-V4.0: non ANSI. Usare l'opzione -std

    compilatori GNU

    Per questi compilatori, come per molti altri tool della GNU, si devono fare delle considerazioni a parte. Sia le opzioni che le caratteristiche infatti, possono essere diverse da quelle dei compilatori proprietari. Va notato che comunque i compilatori GNU sono forse i piu' completi e flessibili.
    Le opzioni -Idir, -Llibdir e -o, come tante altre opzioni di uso normale, sono identiche.
    Esistono invece molte opzioni che gli altri compilatori non prevedono; vediamo alcune:

  • ANSI: no, usare opzione -ansi
  • opzioni di warning: avvisano di eventuali problemi (non errori) di compilazione. Consiglio almeno in fase di sviluppo del codice, l'opzione -Wall
  • debugging:-g o -ggdb per usare il debugger GNU