GCC 3.0.2 - Installazione, uso e trucchi

Autore:Platon Fomichev & Andrew Zabolotny
Documento
originale:
http://www.os2ezine.com/20011216/page_4.html
Data:31/12/2001
Revisione:1.0
Progetto:PIDO/2 (http://www.ecomstation.it/pido2/)
Traduzione:Mirco Miranda
Cambiamenti: V1.0 - versione iniziale
V1.01 - validata HTML 4.01

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: (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: 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:
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)

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 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

(Torna all'Indice)