2011-12-29 35 views
7

Tôi đang tìm cách triển khai Cây lai (không quan trọng) và tìm một cây "cũ" here.Làm thế nào để chạy chương trình được viết cho trình biên dịch cũ?

Tác giả cho biết họ đã cố gắng mã này trên nền tảng SUN Sparc (chạy Solaris 2,6) và với gcc-2.8.1 biên dịch. Và môi trường của tôi là phiên bản gcc 4.4.3 (Ubuntu 10.10).

Vấn đề là: tôi chạy "làm" với makefile ông cung cấp, nhưng nó mang lại cho tôi rất nhiều thông báo lỗi như sau:

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 

Tôi biết tôi cần phải sửa đổi mã souce để đồng ý với trình biên dịch hiện đại, chẳng hạn như thay đổi vector.h thành vector. Nhưng tôi thấy nó vô tận. Vì vậy, câu hỏi của tôi là: có bất kỳ phương pháp convienent để chạy chương trình này, không có vấn đề tự động chuyển đổi mã này thành "phong cách hiện đại" hoặc sử dụng một trình biên dịch "kiểu cũ" độc lập?

Mọi đề xuất?

=== Cập nhật: ===

Cảm ơn tất cả các bạn, tôi cài đặt gcc2.8.1 trong một thư mục khác nhau sử dụng --prefix=/usr/local/gcc-2.8.1 và sửa đổi các "Makefile" để sử dụng cũ phiên bản này gcc (/usr/local/gcc-2.8.1/bin/gcc). Nhưng khi tôi chạy "làm cho", nó vẫn mang lại cho tôi lỗi không tìm các tiêu đề:

/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 

Sau đó, tôi đã cố gắng để tìm thấy những người đứng đầu trong /usr/local/gcc-2.8.1 sử dụng find /usr/local/gcc-2.8.1 -name "*vector*", nhưng có gì .

Vậy những đầu này cho gcc phiên bản cũ ở đâu?

Trả lời

-2

Để bắt đầu, hãy thử xóa ".h" khỏi tệp tiêu đề hệ thống được đề cập trong thông báo lỗi. Nó có thể sẽ cung cấp cho bạn các lỗi khác, nhưng chỉ cần cố gắng và sửa chúng từng cái một.

+1

Ông đặc biệt yêu cầu một giải pháp khác ngoài đổi tên các tiêu đề. –

+1

Ngoài ra, đổi tên tiêu đề thậm chí không ở gần cuối tiêu đề. Nếu bạn đi theo lộ trình đó, bạn cũng phải lo lắng về các không gian tên - '' đặt mọi thứ trong 'std', ví dụ, trong khi' 'thì không. – cHao

7

Bạn có thể tự tạo vertor.h bao gồm vectơ. Bằng cách này bạn có thể khắc phục sự không tương thích một cách không xâm lấn.

Edit:

Bạn cũng có thể cần phải thêm một using namespace std; trong file header (s). Đây là thường là một ý tưởng tồi nhưng đây là một trong những tình huống mà tôi muốn làm điều đó anyway.

Khi bạn làm cho nó hoạt động, tôi sẽ khuyên bạn nên viết lại nó để sử dụng các tệp tiêu đề và không gian tên kiểu mới.

+0

Nhập khẩu không gian tên là một điều trình biên dịch, vì vậy không có '#' trước nó! – ThiefMaster

+0

Cảm ơn. Sẽ sửa chữa. Tôi nói C++ của tôi đã bị gỉ. –

3

Debian Lenny (oldstable) có gcc 3.4. Điều này có thể có khả năng tương thích ngược tốt hơn. Cố gắng tạo tiêu đề tương thích cho các vấn đề còn lại và đưa chúng vào một thư mục bổ sung -I, ví dụ: tệp tiêu đề vector.h bao gồm vector.

Tự làm ơn và cố gắng không chạm vào mã cũ. Nó rất dễ dàng để phá vỡ mã di sản theo những cách không lường trước được.

0

Bạn có thể thử chạy chương trình trên QEMU mà supports Solaris 2.6. Vấn đề duy nhất có thể là tìm kiếm đĩa cài đặt/hình ảnh. Ngoài ra, có những người bán hộp Solaris cũ trên eBay với giá rẻ, bạn có thể lấy một cái.

GCC cung cấp tải xuống cho các phiên bản rất cũ, bạn có thể có cơ hội tốt hơn nếu bạn thử phiên bản cũ hơn của trình biên dịch.

+0

thx, tôi đã thử điều này, nhưng vẫn không hoạt động. Tôi đã cập nhật bài đăng – teloon

0

gcc có tùy chọn -fpermissive: thử và xem liệu ít nhất một số lỗi có biến mất hay không. Ngoài ra: hãy thử tạo một tệp tiêu đề duy nhất sẽ bao gồm tất cả các tiêu đề cần thiết cần thiết bằng cách sử dụng chỉ thị. Ví dụ, hãy stdinc.h chứa:

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

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

Thay thế tất cả đề cập đến các file C++ tiêu đề di sản với một đĩa đơn bao gồm các stdinc.h. C++ cũ không có không gian tên, vì vậy ngay cả khi bạn thay thế các chỉ thị riêng lẻ chỉ với using namespace std;, các sự cố không thể xảy ra.

0

Nếu điều duy nhất là

#include <vector.h> 

để

#include <vector> 
using namespace std; 

Tại sao không thử sed?

grep cho tất cả bao gồm để xem liệu có bao gồm các tiêu đề khác so với tiêu đề C++ hay không. Nếu không may mắn của bạn.

Một điều phức tạp hơn là có mã cũ dựa vào việc truy cập dữ liệu thông qua trình vòng lặp theo cách không chuẩn. Tôi thấy rằng trong một trình soạn thảo bản đồ Doom cho Linux. Sau đó, bạn có thể cần phải làm công cụ thủ công.

Các vấn đề liên quan