Compilatori in UNIX

In UNIX le fasi di compilazione e link sono attivate 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, è importante verificare quale compilatore si stia per usare (which cc), poiché non necessariamente tale compilatore ha tutte le estensioni e opzioni necessarie. Questo è vero soprattutto per cc, che non su tutte le piattaforme è compatibile ANSI o POSIX (ad es. su HP-UX) (vedi Opzioni aggiuntive).

    Cenni generali

    La sintassi generale del comando è

    cc(f77)(CC) [options] input_file

    I tre compilatori richiedono che il file da compilare soddisfi alcuni requisiti sull'estensione. Le estensioni più 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 è -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 può fare con l'opzione -Idir dove dir è 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 è necessario specificarlo con l'opzione -g.

    Quasi tutti i compilatori ottimizzano il codice: a seconda della piattaforma l'ottimizzazione può essere più o meno spinta. Comunque, è possibile modificarla con l'opzione -Oi dove i è 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 più 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