2011-12-29 17 views
7

Sto cercando un'implementazione di Hybrid Tree (non importante) e trovo uno "vecchio" here.Come eseguire il programma scritto per il vecchio compilatore?

l'autore ha detto che hanno provato questo codice sulla piattaforma Sun SPARC (in esecuzione Solaris 2.6) e con gcc-2.8.1 compilatore. E il mio ambiente è versione gcc 4.4.3 (Ubuntu 10.10).

Il problema è: corro "fare" con il makefile egli fornisce, ma mi dà un sacco di messaggio di errore come segue:

g++ -c Node.C 
g++ -c DataNode.C 
In file included from DataNode.h:18, 
       from DataNode.C:17: 
Query.h:9:20: error: vector.h: No such file or directory 
Query.h:10:19: error: stack.h: No such file or directory 
Query.h:13:22: error: function.h: No such file or directory 
Query.h:14:22: error: iostream.h: No such file or directory 
DataNode.C:283:8: warning: extra tokens at end of #endif directive 
In file included from DataNode.h:18, 
       from DataNode.C:17: 
Query.h:29: warning: ‘typedef’ was ignored in this declaration 
Query.h:44: warning: ‘typedef’ was ignored in this declaration 
Query.h:86: error: expected initializer before ‘<’ token 
Query.h:118: error: ISO C++ forbids declaration of ‘PQ’ with no type 
Query.h:118: error: expected ‘;’ before ‘*’ token 
Query.h:122: error: ISO C++ forbids declaration of ‘PQ’ with no type 
Query.h:122: error: expected ‘;’ before ‘*’ token 
Query.h:126: error: ISO C++ forbids declaration of ‘PQ’ with no type 
Query.h:126: error: expected ‘;’ before ‘*’ token 
Query.h:135: error: expected initializer before ‘<’ token 
DataNode.C: In member function ‘void DataNode::DisconnectBranch(int)’: 
DataNode.C:80: error: ‘memmove’ was not declared in this scope 
make: *** [DataNode.o] Error 1 

so che ho bisogno di modificare il codice souce in modo da d'accordo con il compilatore morden, come ad esempio cambiare vector.h a vector. Ma trovo che sia infinito.

Quindi la mia domanda è: esiste un metodo conveniente per eseguire questo programma, non importa automaticamente la conversione di questo codice in "stile moderno" o utilizzando un compilatore "vecchio stile" autonomo?

Qualche suggerimento?

=== Aggiornamento: ===

Grazie a tutti, ho installato gcc2.8.1 in una directory diversa utilizzando --prefix=/usr/local/gcc-2.8.1 e modificare il "makefile" per utilizzare questa vecchia-versione di gcc (/usr/local/gcc-2.8.1/bin/gcc). Ma quando ho eseguito "fare", mi dà ancora errori di non trovare le intestazioni:

/usr/local/gcc-2.8.1/bin/gcc -c DataNode.C 
In file included from DataNode.h:18, 
       from DataNode.C:17: 
Query.h:9: vector.h: No such file or directory 
Query.h:10: stack.h: No such file or directory 
Query.h:11: deque: No such file or directory 
Query.h:12: algorithm: No such file or directory 
Query.h:13: function.h: No such file or directory 
Query.h:14: iostream.h: No such file or directory 
make: *** [DataNode.o] Error 1 

Poi ho cercato di trovare queste teste a /usr/local/gcc-2.8.1 utilizzando find /usr/local/gcc-2.8.1 -name "*vector*", ma ho niente .

Quindi, dove sono queste teste per la versione precedente di gcc?

risposta

-2

Per iniziare, provare a rimuovere ".h" dai file di intestazione di sistema menzionati nel messaggio di errore. Probabilmente ti darà altri errori, ma prova a risolverli uno per uno.

+1

Ha chiesto specificamente una soluzione oltre a rinominare le intestazioni. –

+1

Inoltre, la ridenominazione delle intestazioni non è nemmeno prossima alla fine. Se segui questa strada, devi anche preoccuparti dei namespace - '' inserisce tutto in 'std', ad esempio, mentre' ' no. – cHao

7

Puoi creare tu stesso un vertor.h che include il vettore. In questo modo puoi risolvere le incompatibilità in modo non invasivo.

Edit:

Potrebbe anche essere necessario aggiungere un using namespace std; nel file di intestazione (s). Questo è generalmente una cattiva idea, ma questa è una situazione in cui lo farei comunque.

Una volta eseguito, si consiglia di riscriverlo per utilizzare i nuovi file di intestazione stile e spazi dei nomi.

+0

L'importazione di spazi dei nomi è una cosa del compilatore, quindi non c'è '#' di fronte! – ThiefMaster

+0

Grazie. Risolverà. Ho detto che il mio C++ era arrugginito. –

3

Debian Lenny (oldstable) ha gcc 3.4. Questo potrebbe avere una migliore compatibilità con le versioni precedenti. Prova a creare intestazioni di compatibilità per il resto dei problemi e includerli tramite una directory aggiuntiva -I, ad es. un file di intestazione vector.h che include vector.

Fatti il ​​favore e cerca di non toccare il vecchio codice. È facile rompere il codice legacy in modi imprevisti.

0

Si potrebbe provare a eseguire il programma su QEMU che supports Solaris 2.6. L'unico problema potrebbe essere la ricerca del disco/immagine di installazione. Inoltre, ci sono persone che vendono vecchie scatole Solaris su eBay a basso costo, potresti essere in grado di prenderne una.

GCC fornisce il download per versioni molto vecchie, si potrebbe essere in grado di ottenere migliori possibilità se si prova la versione precedente del compilatore.

+0

thx, ho provato questo, ma ancora non funziona. Ho aggiornato il post – teloon

0

gcc ha l'opzione -fpermissive: provare e vedere se almeno alcuni errori scompaiono. Inoltre: prova a creare un singolo file di intestazione che includa tutte le intestazioni necessarie con le direttive. Ad esempio, fare stdinc.h contenente:

#include <vector> 
#include <iostream> 
#include <stack> 
... 

using std::vector; 
using std::fstream; 
... 

Sostituire tutti i riferimenti di file di intestazione C++ legacy con una sola comprendono di stdinc.h. Il vecchio C++ non aveva spazi dei nomi, quindi anche se si sostituiscono singole direttive con solo using namespace std;, gli scontri sono improbabili.

0

Se l'unica cosa è

#include <vector.h> 

a

#include <vector> 
using namespace std; 

perché non provare sed?

grep for all include per vedere se ci sono altri inclusi rispetto alle intestazioni C++. Se non sei fortunato.

Un'altra cosa più difficile è che esiste un codice vecchio che si basa sull'accesso ai dati tramite gli iteratori in un modo non standard. L'ho visto in un editor di mappe di Doom per Linux. Quindi potrebbe essere necessario fare cose manuali.

Problemi correlati