Скомпилируйте старое Unix-приложение C ++ для использования в Windows - PullRequest
0 голосов
/ 14 января 2009

Мне нужен исполняемый файл Windows для некоторого кода, который был написан в 1994 году для UNIX. Я пытался сделать это из среды Cygwin. С этого времени стандарт C ++ был изменен, и стандартные библиотеки тоже.

Я пытался использовать параметры -std = и -traditional-cpp, но эти параметры мне совсем не помогли. Я также обнаружил, что -fno-for-scope и -fno-operator-names уменьшают количество ошибок. Кроме того, библиотеки ввода / вывода были значительно изменены с того времени. Я также думаю, что есть некоторая возможность того, что предопределенные (препроцессором) макросы также изменятся с того времени.

Авторские пометки по коду:
http://research.microsoft.com/en-us/um/people/hoppe/code.htm

Ответы [ 3 ]

1 голос
/ 14 января 2009

Код C в библиотеке (библиотека / linpack и библиотека / рецепты) компилируется нормально, используя:

gcc -c *.c

Код C ++ более проблематичен. В ../include есть заголовки, и они требуют -DANSI для получения прототипов функций. Они не объявлены extern "C" в заголовках; они правильно включены в заголовки в директории источника C ++:

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

Итак, компилируя A3dStream.C, я получаю:

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

Другие файлы приводят к подобным наборам ошибок.

Я использую GCC 3.4.4 на Cygwin под Windows XP.

Я не гуру C ++ - хотя я делаю свою большую долю программной археологии - но мне кажется, что вам понадобится обновить код для использования стандартных заголовков C ++, потому что в частности отсутствует strstream.h поэтому, номинально, вместо этого используйте <strstream>), и это означает, что вам придется иметь дело с пространством имен std и т.п. Этот код предшествует стандарту на 5 лет, так что нередко приходится взламывать его, чтобы обновить его.

Удачи!

0 голосов
/ 14 января 2009

Вы все еще можете загрузить исходный код для gcc 2.7.0 с веб-сайта GNU.

Вы можете скачать и сделать старую версию компилятора.

0 голосов
/ 14 января 2009

Я могу думать о двух возможностях: AT & T предлагает как UWIN (что может отличаться от Cygwin, чтобы избежать той же проблемы), так и источник старых версий CFront (который вероятно используется оригинальный компилятор).

Ну, есть третья возможность, и я думаю, что это рекомендуемое действие: отредактируйте источник и приведите его в соответствие со стандартом. Если вы собираетесь продолжить разработку этого кода, лучше откусить пулю раньше, чем позже.

...