Как запустить программу, написанную для старого компилятора? - PullRequest
7 голосов
/ 29 декабря 2011

Я ищу реализацию гибридного дерева (не важно) и нахожу "старый" здесь .

Автор сказал, что он пробовал этот код на платформе SUN Sparc (под управлением Solaris 2.6 ) и с компилятором gcc-2.8.1 . И моя среда gcc версия 4.4.3 ( Ubuntu 10.10 ).

Проблема в следующем: Я запускаю «make» с make-файлом, который он предоставляет, но он выдает мне много сообщений об ошибках следующим образом:

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

Я знаю, что мне нужно изменить код souce, чтобы он соответствовал компилятору morden, например, изменив vector.h на vector. Но я считаю, что это просто бесконечно.

Итак, мой вопрос: есть ли какой-нибудь удобный метод для запуска этой программы, независимо от того, автоматически ли он конвертирует этот код в «современный стиль» или использует автономный компилятор «старого стиля»?

Есть предложения?

=== Обновление: ===

Спасибо всем, я установил gcc2.8.1 в другой каталог, используя --prefix=/usr/local/gcc-2.8.1 и изменил "makefile", чтобы использовать этот gcc старой версии (/usr/local/gcc-2.8.1/bin/gcc). Но когда я запускаю команду «make», она все равно выдает ошибки, связанные с отсутствием поиска заголовков:

/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

Затем я попытался найти эти головы в /usr/local/gcc-2.8.1, используя find /usr/local/gcc-2.8.1 -name "*vector*", но ничего не получил.

Так, где эти головы для старой версии gcc?

Ответы [ 5 ]

8 голосов
/ 29 декабря 2011

Вы можете сделать vertor.h самостоятельно, включая вектор.Таким образом, вы можете неинвазивно исправлять несовместимости.

Редактировать:

Вам также может понадобиться добавить using namespace std; в заголовочный файл (ы).Как правило, это плохая идея, но это одна из ситуаций, когда я все равно это сделаю.

Как только вы все заработаете, я бы порекомендовал переписать его, чтобы использовать файлы заголовков нового стиля и пространства имен.

3 голосов
/ 29 декабря 2011

Debian Lenny (oldstable) имеет gcc 3.4. Это может иметь лучшую обратную совместимость. Попробуйте сделать заголовки совместимости для остальных проблем и включите их через дополнительный каталог -I, например. заголовочный файл vector.h, включающий vector.

Сделайте себе одолжение и постарайтесь не трогать старый код. Легко сломать унаследованный код непредвиденными способами.

0 голосов
/ 27 октября 2013

Если только

#include <vector.h>

до

#include <vector>
using namespace std;

Почему бы не попробовать sed?

grep для всех включений, чтобы увидеть, есть ли другие включенныезаголовки с ++.Если вам не повезло.

Еще одна хитрость в том, что существует старый код, который полагается на доступ к данным через итераторы нестандартным способом.Я видел это в редакторе карт Doom для Linux.Тогда вам может понадобиться ручная работа.

0 голосов
/ 30 декабря 2011

gcc имеет параметр -fpermissive: попробуйте и посмотрите, исчезнут ли хотя бы некоторые ошибки. Также: попробуйте создать один заголовочный файл, который будет включать все необходимые заголовки с использованием директив. Например, сделать stdinc.h содержащий:

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

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

Заменить все упоминания устаревших заголовочных файлов C ++ одним включением stdinc.h. В старом C ++ не было пространств имен, поэтому даже если вы замените отдельные директивы просто using namespace std;, конфликты маловероятны.

0 голосов
/ 29 декабря 2011

Вы можете попробовать запустить программу в QEMU, которая поддерживает Solaris 2.6 .Единственной проблемой может быть поиск установочного диска / образа.Кроме того, есть люди, которые продают старые ящики Solaris на eBay по дешевке, возможно, вы сможете получить один из них.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...