GCC 3.0.2 - Installazione, uso e trucchi

Transcript

GCC 3.0.2 - Installazione, uso e trucchi
GCC 3.0.2 − Installazione, uso e trucchi
Mirco Miranda
GCC 3.0.2 − Installazione, uso e trucchi
Tabella dei Contenuti
GCC 3.0.2 − Installazione, uso e trucchi...........................................................................................................1
Indice........................................................................................................................................................1
1. Prima di iniziare...................................................................................................................................1
2. Installazione e configurazione.............................................................................................................2
3. Esempio di un semplice programma C++............................................................................................4
4. Risposte alle domande più frequenti....................................................................................................4
5. Suggerimenti tecnici............................................................................................................................5
i
GCC 3.0.2 − Installazione, uso e trucchi
Autore:
Platon Fomichev Andrew Zabolotny
Documento
http://www.os2ezine.com/20011216/page_4.html
originale:
Data:
31/12/2001
Revisione:
1.0
Progetto:
PIDO/2 (http://www.quasarbbs.net/pido2)
Traduzione: Mirco Miranda
Indice
1. Prima di iniziare
2. Installazione e configurazione
3. Esempio di un semplice programma C++
4. Risposte alle domande più frequenti
5. Suggerimenti tecnici
1. Prima di iniziare
Perchè il GCC? Questa potrebbe essere la prima domanda che salta in mente. Qualsiasi sviluppatore OS/2 che
lo usa avrà una propria risposta a tale domanda, la mia è che il GCC è un buon compilatore, veloce e robusto
che permette il porting di applicazioni da Unix ad OS/2. Detto questo, il GCC 3.0.2 ha varie caratteristiche
interessanti che lo distinguono dagli altri compilatori:
• Alta portabilità. Il GCC al giorno d'oggi gira su un gran numero di sistemi operativi e svariate
piattaforme. Quella che segue è solo una lista delle CPU supportate dal gcc (presa da gcc/listing/*):
1750a, a29k, alpha, arc, arm, avr, c4x, clipper, convex, d30v, dsp16xx, elxsi, fr30, h8300, i370, i386,
i860, i960, ia64, m32r, m68hc11, m68k, m88k, mcore, mips, mn10200, mn10300, ns32k, pa, pdp11,
pj, romp, rs6000, s390, sh, sparc, v850, vax, we32k. Senza pensare che per ogni CPU menzionata il
gcc supporta più sistemi operativi (si pensi ad esempio all' x86).
• Standard. Gli sviluppatori del GCC hanno cercato di rispettare tutti gli standard del linguaggio (a
differenza di altri compilatori) per assicurare una alta compatibilità. Inoltre il gcc prevede il parametro
"−ansi" che assicura la compatibilità totale con lo standard ANSI disabilitando tutte le estensioni
specifiche della piattaforma usata.
• Ottimizzato. Di tutti i compilatori esaminati il GCC è quello con il più sofisticato ottimizzatore. Per le
piattaforme x86, il gcc prevede parametri di ottimizzazione del codice per la maggior parte delle CPU
esistenti, dall'i386 all'Athlon al Pentium Pro.
• Opzioni. Di tutti i compilatori esaminati, il GCC è quello con il più alto numero di parametri che
permettono di avere il pieno controllo sul codice che sta per essere generato, sui dialetti del
linguaggio, sui 'warning' che sono emessi e su come il processo è stato portato a termine.
• Open source. Il GCC è stato il primo compilatore C/C++ libero. E' possibile prendere i sorgenti e
controllare esattamente come lavora nel caso si abbiano dei dubbi dopo aver letto la documentazione
dettagliata e di alta qualità che viene fornita. E' possible correggere dei Bug nel caso vengano trovati
GCC 3.0.2 − Installazione, uso e trucchi
1
GCC 3.0.2 − Installazione, uso e trucchi
senza aspettare mesi per un "service pack". E' inoltre possibile partecipare al suo sviluppo.
(Torna all'Indice)
2. Installazione e configurazione
Scaricamento pacchetti
Il GCC 3.0.2 attualmento è allo stato di software 'beta', ma questo non vuol dire che non funzioni. Il tempo per
il rilascio di un compilatore, vista la sua complessità, è molto lungo. Pensiamo che attualmente sia
utilizzabile, quindi libero da grossi errori. Consiglio a tutti di provarlo ora, anche perchè la versione definitiva
non apparirà prima del prossimo anno. Siccome il prodotto è ancora in uno stadio di 'beta', per favore non
mettetelo su Hobbes o su altri archivi OS/2.
Scarica GCC 3.0.2 dal server Netlabs
Requisiti
Sono necessari i seguenti pre−requisiti per installare ed usare il GCC 3.0:
• OS/2 Warp 3 o superiori. Se si deve usare la libreria C++ standard (libstdc++) è inoltre necessario il
supporto Unicode (per Warp 3 serve almeno il FP26).
• EMX 0.9d fix 4. Notare che non si parla solo del runtime, ma di tutto il pacchetto emx, un toolkit con
un proprio compilatore (GCC 2.8.1), tools e header.
• 32MB di ram per lo sviluppo di applicazioni C e 64 per il C++, perchè l'ottimizzatore GCC è
veramente affamato di memoria.
• Una corretta configurazione dei SET nel config.sys. Assicurarsi che sia tutto configurato
correttamente per EMX.
• Fix della runtime dll C di emx per il single−threading. Questo è richiesto per rimuovere potenziali
problemi con l'uso misto delle DLL multi−thread e single−thread.
Il pacchetto si chiama emx−strt−fix−0.0.2.zip e si trova su Hobbes.
• GNU gettext 0.10.40. La versione precedente (0.10.35) funziona correttamente ma la 0.10.40 è
altamente consigliata ed è pienamente compatibile.
• Binutils 2.11.2 (binary utilities). I nuovi binutils con il nuovo compilatore assembler sono richiesti. Il
vecchio GAS non funziona.
ATTENZIONE: GAS 2.9.1 genera silenziosamente codice errato!
• Sono inoltre richiesti una vasta gamma di utilità Unix per il lavoro di tutti i giorni, per GCC serve il
GNU Make, altri pacchetti utili sono i GNU File Utilities, GNU text utilities, GNU patch/diff e altri.
Consigliato scaricarli da Hobbes.
Installazione
L'installazione è molto semplice, basta copiare i pacchetti nella directory ove è situato EMX (es. C:\emx) e
scompattarli assicurandosi di preservare la struttura delle directory nell'archivio.
Tutti i pacchetti del GCC hanno una struttura comune delle directory che aiuta a preservare il vecchio EMX
GCC ed usarlo assieme al nuovo. Tutti i binari vengono installati sotto emx/bin.new/ e non sovrascrivono
nulla in emx/bin/. Sono disponibili i seguenti compilatori:
• gcc−os2−3.0.2−docs.zip − Documentazione in formato INF per i compilatori
2. Installazione e configurazione
2
GCC 3.0.2 − Installazione, uso e trucchi
• gcc−os2−3.0.2−gcc.zip − Compilatore GNU C
• gcc−os2−3.0.2−gcj.zip − GNU Java Compiler. Il runtime GNU Java runtime non è stato attualmente
portato soto OS/2. Malgrado ciò se qualcuno vuole continuare il portin è libero di farlo. Il compilatore
di per se sembra pienamente funzionante.
• gcc−os2−3.0.2−goc.zip − Compilatore GNU C ad oggetti
• gcc−os2−3.0.2−gpp.zip − Compilatore GNU C++ (compilatore C richiesto)
• gcc−os2−3.0.2−g77.zip − Compilatore GNU Fortran
• gcc−os2−3.0.2−diff.zip − Differenze tra i sorgenti GCC standard e quelli per OS/2
Scompattare i pacchetti dei compilatori nella directory di emx. Per lo sviluppo di applicativi C++ sono
necessari sia il compilatore C che quello C++. Assicurarsi inoltre di avere la directory 'emx/dll/' nel
LIBPATH.
Spostare il file /emx/bin.new/newgcc.cmd in /emx/bin; modificare poi questo file con i settaggi necessari:
tutte le istruzioni sono scritte all'interno di newgcc.cmd. Ora per usare il nuovo compilatore gcc basta eseguire
newgcc.cmd. Per tornare al vecchio environment basta chiudere la shell da cui si opera digitando exit. Se si
desidera rimpiazzare completamente il vecchio gcc 2.8.x (emx) con il nuovo è sufficente spostare tutti i file in
/emx/bin.new in /emx/bin sovrascrivendo i file con lo stesso nome, poi cancellare /emx/bin.new.
Ora si procederà all'aggiornamento di EMX e alla creazione delle librerie.
Passare al nuovo compilatore con newgcc.cmd, e controllare che il compilatore di base funzioni: digitare gcc
−v e g++ −v per vedere la versione del compilatore attualmente attivo. Dovrebbe apparire 3.0.2 come versione
in entrambi i casi. Se si verificano errori o core−dump durante il lancio, è tempo di tornarsi a leggere le
istruzioni di installazione :−)
Costruzione delle librerie OMF
(Prima di procedere, assicurarsi di essere passati al GCC 3.0.2!)
Dalla scrittura di EMX 0.9, IBM ha aggiunto a OS/2 svariate API tra cui le API Unicode. Per poter usare le
API Unicode con EMX è stato necessario riscriversi le definizioni delle API mancanti (i file .h). Per
aggiungere le funzioni mancanti a os2.a e a os2.lib (queste librerie definiscono tutte le funzioni specifiche di
OS/2) è sufficente andare in /emx/lib e digitare 'make'. Questa operazione ricostruirà os2.a aggiungendo le
funzioni in unicode.imp, poi riconvertirà tutte le datate librerie OMF (.lib) dalle omonime librerie .a.
Inoltre è necessario eseguire make anche dalla directory /emx/lib/gcc−lib/i386−pc−os2_emx/3.0.2/. Questo
per lo stesso motivo di cui sopra.
Configurazione delle variabili di ambiente
Ora è necessario porsi alcune domande. E' stato veramente installato EMX fix 4? Si conosce dove EMX è
posizionato? Si conosce il proprio LIBPATH? Sono state aggiornate le librerie di EMX?
Queste sono semplici ma altrettanto importanti domande perchè se qualcosa non è configurato correttamente,
si avrà a che fare con dei grossi problemi inclusi core−dump, codici di procedure illegali ecc..
E' ora di controllare il proprio config.sys. In primo luogo verificare C_INCLUDE_PATH, questa non è
veramente importante, ma è meglio verificare che punti alla directory corretta. Notare che tale variabile
potrebbe non essere presente.
Controllare ora CPLUS_INCLUDE_PATH, questa è importantissima. Il nuovo compilatore C++ usa i nuovi
file e non quelli forniti con EMX. Impostare in questa variabile al path corretto (es: emx\include\g++−v3)
prima di ogni altro parametro specificato.
(Torna all'Indice)
2. Installazione e configurazione
3
GCC 3.0.2 − Installazione, uso e trucchi
3. Esempio di un semplice programma C++
Useremo un semplice programma per mostrare alcune funzioni con il formato OMF. Creare un file chiamato
test.cpp con il seguente programma:
#include <iostream.h>
using namespace std;
int main()
{
cout<<"Hello World"<<endl;
return 0;
}
Ora compilare lanciando g++ test.cpp. Nessun problema, abbiamo un oggetto a.out.
Ora g++ test.cpp −Zomf
Dovrebbero apparire una serie di errori di link, tipo:
X:\......\gcc−lib\i386−pc−os2_emx\3.0.2\st\stdcxx.lib(functexcept.obj):
error L2025: _ZTSSt9exception : symbol defined more than once
Questo avviene perchè collegando (fase di link) con le librerie libstdc++ sono necessarie particolari attenzioni
quando si usa il formato OMF: cancellare weaksyms.omf dalla directory corrente, spostarsi in
emx\lib\gcc−lib\i386−pc−os2_emx\3.0.2\ e copiare la lista dei simboli weak da qui nella propria directory.
Ripetere la compilazione. Ora dovrebbe avvenire tutto correttamente.
Come molti sanno il gcc non genera direttamente i file OMF ma genera i file a.out che verranno convertiti
tramite emxomf ed infine collegati con LINK386 o ILINK. [...]
Se il proprio progetto usa più directory, emxomf può non trovare weaksyms.omf. In questo caso si può
incorrere nell'errore di simboli duplicati. La soluzione è di mantenere una unica lista dei simboli weak
settando la variabile di ambiente GCC_WEAKSYMS che punta al file in cui tutte le liste dei propri simboli
sono contenuti:
SET GCC_WEAKSYMS=d:/myproject/weaksyms.omf
La libreria libstdc++ contiene molti simboli weak e se la propria applicazione usa libstdc++, emxomf deve
saperlo prima. Per questo motivo prima di iniziare la compilazione di un progetto è necessario copiare il file
weaksyms.omf fornito con il gcc (lib/gcc−lib/i386−pc−os2_emx/x.x.x/weaksyms.omf) nella directory del
proprio progetto.
(Torna all'Indice)
4. Risposte alle domande più frequenti
D) La compilazione è lenta
R) Impostare SET GCCLOAD=x, dove x è il numero di minuti che il GCC rimane residente in memoria.
Tentare anche con l'opzione −pipe durante la compilazione e/o usando SET GCCOPT=−pipe.
D) Fork non funziona nel GCC 3.0.2, perchè?
R) Non è esatto, fork non funziona quando si compila col parametro −Zcrtdll perchèla funziona fork() di
3. Esempio di un semplice programma C++
4
GCC 3.0.2 − Installazione, uso e trucchi
EMX viene confusa dalla nuova gcc302*.dll. Aggiungendo "−lgcc" dopo −Zcrtdll l'applicazione non sarà
collegata (linking) con gcc302*.dll e fork() riprenderà a funzionare.
D) Non riesco ad allocare più di 32MB di memoria. Come fare?
R) Questa è una caratteristica di EMX. Normalmente le applicazioni generate da EMX sono limitate ad usare
32MB di memoria heap perchè fork() si aspetta che l'heap sia allocato in un unico grande segmento. Se non si
usa fork() si può usare la funzione _uflags() per dire ad EMX che non si desidera che l'heap sia continuo.
D) Quali macro specifiche per OS/2 sono definite da GCC 3.0.2?
R) Si può vedere questo lanciando gcc −v su un file .c o .cpp. I simboli specifici per OS/2 sono __OS2__ e
__EMX__; altri simboli come __i386__ sono definiti in base alla CPU.
D) GDB non trova i nomi delle mie funzioni!
R) g++ 3.0 e successive usano un nuovo 'name mangler'. Questo significa che gdb e le vecchie applicazioni
non possono risalire hai nomi correti. Non c'è nulla che si possa fare tranne provare a portare un gdb più
recente :−)
D) −mcpu=pentiumpro non velocizza le mie applicazioni, è un bug?
R) La velocità aumenta marginalmente ed ha incrementi significativi solo su algoritmi computazionali. I
normali programmi sono limitati da altri fattori. Si raccomanda di compilare con i parametri −O2
−march=i386 che consentono di ridurre la dimensione del codice senza apprezzare nessuna variazione
prestazionale.
D) La dimensione dell'eseguibile è troppo grande, come ridurla?
R) Si può provare con −Zcrtdll. Inoltre se il progetto è scritto in C++ e non si vogliono usare le eccezioni, è
possibile usare −fno−exceptions: questo riduce la dimensione dell'eseguibile. Anche −fno−rtti può ridurla
ulteriormente. In fine provare con −Os che ottimizza in dimensione invece che in velocità.
D) Posso mescolare i file oggetto del vecchio gcc col nuovo?
R) Solo per programmi C. Come già detto sopra il C++ 'mangler' è stato cambiato nella nuova versione quindi
si avrebbero degli errori di link.
(Torna all'Indice)
5. Suggerimenti tecnici
• Il port per OS/2 del gcc (e solo lui) ha un nuovo flag: −malign−strings. Di default il gcc usa un
allineamento a 32−byte per le stringhe. E' stato aggiunto un allineamento dipendente dalla CPU (4
byte per 386/486, 32 per pentium o più recenti) e un opzione per sovrascrivere i valori di default. 'x' è
una potenza del due (es. 5 indica 32 bytes). Il compilatore è stato compilato con −malign−strings=0
che da solo rende il compilatore C++ (cc1plus.exe) 150KB più piccolo! [...]
• Il gcc 3.0 ha l'annoiante allineamento dello stack a 128 Bit. Questo genera file più grandi. Per evitare
questo usare −mpreferred−stack−boundary=4 o quello che si preferisce (questo argomento è in byte).
L'allineamento a 32 byte dello stack ha senso solo se si usano le istruzioni SSE (ma chissà perchè è
sempre abilitato).
• La CPU di default èi386. E' possibile generare codice più veloce (in genere anche più grande) usando
l'opzione −mcpu=xxx dove xxx è uno dei seguenti parametri: i386, i486, i586, pentium (=i586), i686,
pentiumpro (=i686), k6, athlon.
• Su tutte le CPU più recenti dell'i386 e Athlon l'allineamento di default per funzioni, cicli e salti è di
16 bytes e 32 bytes per i K6! Questo genera molto spazio non usato (NOP) negli eseguibili
5. Suggerimenti tecnici
5
GCC 3.0.2 − Installazione, uso e trucchi
specialmente se si usano molte piccole funzioni, molti cicli e molte etichette (label). Usando
−mcpu=xxx, per ottimizzare per dimensione invece che per velocità usare −malign−loops=2,
−malign−jumps=2 e −malign−functions=2.
• Il semi−leggendario supporto per MMX e SSE che è menzionato nella documentazione NON sta ad
indicare che il gcc genera codice SSE o MMX da sorgenti C/C++. E' menzionato per l'esistenza di un
certo numero di funzioni speciali del gcc come __builtin_ia32_emms(), __builtin_ia32_psllw() e così
via, che servono al posto della scrittura diretta di __asm("emms") ecc... OK, è carino scrivere codice
MMX con un look simile al C piuttosto che direttamente in assembler, ma è necessario reperire da
qualche parte i rispettivi header e/o documentazione (probabilmente esistono da qualche parte nel
mondo Linux).
(Torna all'Indice)
5. Suggerimenti tecnici
6