2009-01-14 6 views
0

J'ai besoin d'un exécutable Windows pour du code qui a été écrit en 1994 pour UNIX. J'ai essayé de le faire à partir de l'environnement cygwin. La norme C++ a été modifiée à partir de ce moment et les bibliothèques standard aussi.Compiler une ancienne application Unix C++ pour l'utiliser dans Windows

J'ai essayé d'utiliser les options -std = et -traditional-cpp, mais ces options ne m'ont pas du tout aidé. J'ai également trouvé que -fno-for-scope et -fno-operator-names réduisaient le nombre d'erreurs. En outre, les bibliothèques d'entrées/sorties ont été considérablement modifiées à partir de ce moment. Je pense aussi qu'il y a une certaine possibilité que des macroses prédéfinies (par préprocesseur) soient également modifiées à partir de ce moment.

Notes de l'auteur sur le code:
http://research.microsoft.com/en-us/um/people/hoppe/code.htm

+0

Cela nous aiderait probablement si vous décriviez au moins l'une des erreurs que vous obtenez en essayant de compiler ce code, ce que vous avez essayé de faire pour corriger l'erreur, et quels étaient les résultats. –

+0

Et la question est? –

Répondre

1

Le code C dans la bibliothèque (bibliothèque/Linpack et bibliothèque/recettes) compile bien en utilisant:

gcc -c *.c 

Le code C++ est plus problématique. Il y a des en-têtes dans ../include et ils requièrent -DANSI pour produire des prototypes de fonctions. Ils ne sont pas déclarés extern "C" dans les en-têtes; ils sont correctement inclus dans les en-têtes dans la source C de dir:

extern "C" { 
#include "linpack.h" 
} 

Ainsi, la compilation A3dStream.C, je reçois:

$ g++ -DANSI -I../include -c A3dStream.C 
In file included from /usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/backward/iostream.h:31, 
       from Hh.h:12, 
       from A3dStream.C:4: 
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/backward/backward_warning.h:32:2: 
warning: #warning This file includes at least one deprecated or antiquated header. 
Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ 
standard. Examples include substituting the <X> header for the <X.h> header for 
C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable 
this warning use -Wno-deprecated. 
In file included from A3dStream.C:4: 
Hh.h:15:23: strstream.h: No such file or directory 
In file included from A3dStream.C:4: 
Hh.h:45: error: declaration of C function `void bzero(void*, int)' conflicts with 
/usr/include/string.h:54: error: previous declaration `void bzero(void*, size_t)' here 
Hh.h:46: error: declaration of C function `int gethostname(char*, int)' conflicts with 
/usr/include/sys/unistd.h:206: error: previous declaration `int gethostname(char*, size_t)' here 
Hh.h:98: error: an explicit specialization must be preceded by 'template <>' 
Hh.h:105: error: an explicit specialization must be preceded by 'template <>' 
Hh.h:111: error: an explicit specialization must be preceded by 'template <>' 
Hh.h:221: error: new declaration `void unsetenv(const char*)' 
/usr/include/cygwin/stdlib.h:26: error: ambiguates old declaration `int unsetenv(const char*)' 
In file included from Geometry.h:10, 
       from A3dStream.h:7, 
       from A3dStream.C:5: 
Array.h: In member function `void Array<T>::resize(int)': 
Array.h:40: error: `size' undeclared (first use this function) 
Array.h:40: error: (Each undeclared identifier is reported only once for each function it appears in.) 
Array.h:44: error: `a' undeclared (first use this function) 
Array.h: In member function `void Array<T>::clear()': 
Array.h:51: error: `a' undeclared (first use this function) 
Array.h:51: error: `size' undeclared (first use this function) 
Array.h: In member function `void Array<T>::init(int)': 
Array.h:53: error: `size' undeclared (first use this function) 
Array.h: In member function `void Array<T>::need(int)': 
Array.h:57: error: `size' undeclared (first use this function) 
Array.h: In member function `Array<T>& Array<T>::operator+=(const T&)': 
Array.h:64: error: `a' undeclared (first use this function) 
Array.h: In member function `void Array<T>::squeeze()': 
Array.h:66: error: `size' undeclared (first use this function) 
Array.h: In member function `const T& Array<T>::operator[](int) const': 
Array.h:70: error: `a' undeclared (first use this function) 
Array.h: In member function `T& Array<T>::operator[](int)': 
Array.h:71: error: `a' undeclared (first use this function) 

D'autres fichiers produiraient des erreurs similaires. J'utilise GCC 3.4.4 sur Cygwin sous Windows XP. Je ne suis pas un gourou C++ - bien que je fasse ma part d'archéologie logicielle - mais il me semble que vous aurez besoin de mettre à jour le code pour utiliser les en-têtes standard C++ car strstream.h en particulier est manquant (donc, nominalement, utilisez <strstream> à la place), et cela signifie que vous devrez faire face à l'espace de noms std et autres. Ce code est antérieur à la norme de 5 ans, il n'est donc pas déraisonnable d'avoir à le pirater pour le mettre à jour.

Bonne chance!

0

je peux penser à deux possibilités: AT & T offre à la fois UWIN (qui peut être assez différent de Cygwin pour éviter le même problème) et la source de old versions of CFront (ce qui est probablement le compilateur original utilisé). Eh bien, il y a une troisième possibilité, et je pense que c'est l'action recommandée: modifier la source et la mettre à jour à la norme. Si vous avez l'intention de faire d'autres développements sur ce code, il est préférable de mordre la balle plus tôt que plus tard.

0

Vous pouvez toujours télécharger la source de gcc 2.7.0 depuis le site Web de GNU.

Vous pouvez télécharger et créer l'ancienne version du compilateur.

Questions connexes