2010-02-28 33 views

Trả lời

2
  • Windows và Linux sử dụng các định dạng vùng chứa khác nhau để giữ mã thực thi (PE vs ELF).
  • Windows và Linux có API hoàn toàn khác nhau (ngoại trừ cho các chương trình tầm thường mà chỉ sử dụng màn hình CRT và STL)
  • Windows và Linux có một cấu trúc thư mục hoàn toàn khác nhau

Bạn có thể viết một chương trình mà có thể sử dụng một trong hai tập hợp các API (ví dụ: sử dụng Qt) và có thể xử lý cấu trúc thư mục nhưng bạn vẫn không thể chạy cùng một tệp trên cả hai hệ điều hành do các định dạng vùng chứa khác nhau.

Điều này có thể được giải quyết bằng cách sử dụng Wine.

5

Chương trình gốc không tương thích vì Windows có một bộ API hoàn toàn khác với Linux, cho một. Như những người khác đã đề cập, mỗi nền tảng sử dụng một định dạng thực thi khác nhau là tốt. Ngoài ra cả hai nền tảng có bộ thư viện riêng của họ mà các chương trình sẽ được liên kết với và/hoặc chia sẻ. Ví dụ, một chương trình Windows thường sẽ được phát triển trong Visual Studio bằng cách sử dụng các thư viện cửa sổ cụ thể như MFC, Win32 API, v.v. Các thư viện này không có sẵn trong linux, vì vậy chương trình sẽ không biên dịch trừ khi cẩn thận được thực hiện để đảm bảo chéo các thư viện nền tảng (như QT) được sử dụng.

Nếu bạn cẩn thận, tuy nhiên, bạn có thể sử dụng các thư viện đa nền tảng trong mã của mình và bạn có thể có cùng một chương trình để biên dịch trong cả hai nền tảng. Đối với một chương trình như vậy bạn sẽ cần phải cẩn thận đặt bất kỳ chi tiết nền tảng cụ thể (vị trí hệ thống tệp, vv) trong các tệp của riêng chúng. Sau đó, bạn sẽ cần thiết lập các câu lệnh #define thích hợp và/hoặc chỉ thị makefile để đảm bảo các tệp thích hợp được bao gồm trong bản dựng cho mỗi nền tảng. Tất nhiên, nếu bạn sử dụng ngôn ngữ "đa nền tảng" như Java hoặc Python và không sử dụng bất kỳ mã nền tảng cụ thể nào trong quá trình triển khai, thì chương trình của bạn có thể chạy trong cả hai môi trường.

Note Mặc dù các định dạng thực thi khác nhau, một số chương trình phát triển trên Windows có thể được thực hiện dưới Linux sử dụng một giả lập gọi WINE.

+0

http: // sf.net/projects/line/"thực hiện các ứng dụng Linux chưa được sửa đổi trên Windows bằng cách chặn các cuộc gọi hệ thống Linux" - nghịch đảo của Wine. Tuy nhiên, nó không được duy trì trong một thời gian dài. – ephemient

+0

Cool ... thật đáng tiếc là họ không duy trì nó. Bạn đã thử nhận được bất kỳ chương trình nào để chạy dưới nó? –

+0

Không, tôi không sử dụng Windows, vì vậy tôi chưa bao giờ thử LINE. Tôi nghe nói rằng một số mã đã được xếp thành http://umlwin32.sf.net/ (trong đó, tình cờ, cũng giống như nghịch đảo của http://ring3k.org/), nhưng điều đó cũng không được duy trì. Tôi không thấy nhiều điểm, hoặc là: hầu hết mọi thứ trên Linux đều có sẵn nguồn, vì vậy nó dễ dàng hơn để chỉ cổng và biên dịch lại hơn là làm việc trên các hack như thế này. – ephemient

0

C++ chính nó là di động. Nhưng một số thư viện C++ thì không. Nếu một chương trình C++ sử dụng một số thư viện, mà không phải là di động, thì chương trình này không phải là di động.

Ví dụ, chương trình C++ sử dụng MFC để vẽ đồ họa GUI, vì MFC chỉ được hỗ trợ trong Windows, vì vậy chương trình C++ này không thể được biên dịch hoặc chạy trực tiếp trên Linux.

+0

Để công bằng: Nó có thể có thể, đặc biệt là nếu nó được biên dịch lại/liên kết với Winelib, trong đó có một MFC thực hiện rất tốt. (Mặc dù quan điểm của bạn về tính di động của thư viện/API là chính xác.) – greyfade

0

Mỗi hệ điều hành xác định một API. Nếu bạn mã để gọi số Win32 API, nó sẽ không có trên Linux. Nếu bạn mã hóa tới API POSIX, nó sẽ không chuyển ngay bạn vào Windows.

Để tìm hiểu thêm về điều này, hãy tải xuống chương trình mã nguồn mở đáng kể (ví dụ: Perl hoặc Python) và xem kịch bản 'cấu hình' của nó sắp xếp để biên dịch ở một trong hai nơi như thế nào.

2

Tóm lại,

Hơn nữa, ngay cả khi đã có một công cụ để chuyển đổi giữa PE và ELF, các hướng dẫn chương trình cần thiết để giao tiếp với hệ điều hành hoàn toàn khác nhau giữa Windows và Linux. Chỉ có mã tính toán hạn chế nhất (chỉ tính toán và không tương tác với hệ điều hành) mới có thể được chuyển giữa các hệ thống mà không có hành động đặc biệt. Tuy nhiên, điều này hiếm khi được thực hiện.

Tôi tin rằng một số phiên bản của Linux cho phép bạn tải trực tiếp trình điều khiển thiết bị được thiết kế cho Windows mà không cần biên dịch lại. Tuy nhiên, đây là một ứng dụng mục đích cực kỳ đặc biệt và kỹ thuật này thường không được sử dụng.

+1

Có thể bạn đang nghĩ đến http://ndiswrapper.sf.net/? – ephemient

1

Có hai lý do chính.

Về mặt lý thuyết, cùng một chương trình (mã nguồn) cho một số ngôn ngữ như C, có thể chạy trên cả Windows và Linux. Nhưng việc biên dịch chỉ khác nhau; điều này có nghĩa là bạn phải biên dịch cùng một tệp mã nguồn cho mỗi nền tảng.

Nhưng thực tế, mỗi hệ điều hành có một bộ API khác nhau. Và các kỹ thuật khác nhau để hoàn thành công việc nhanh hơn ... Điều này thường thu hút các nhà phát triển sử dụng chúng. Và họ không tuân thủ các tiêu chuẩn, vì vậy họ mất tính di động.

Đây là chương trình gốc ... Dù sao, có các ngôn ngữ JavaPython ... Chúng thực sự đa nền tảng, nhưng bạn phải hy sinh tốc độ vì lợi ích của tính di động.

0

Đây là một chủ đề lớn.

  1. Đầu tiên, Windows và Linux không thể so sánh nhị phân. Điều này có nghĩa là ngay cả những chương trình đơn giản nhất cũng sẽ không được nhận diện từ máy này sang máy khác. Đây là lý do tại sao các ngôn ngữ thông dịch như PHP, Perl, PythonJava đang trở nên phổ biến, nhưng ngay cả những ngôn ngữ này cũng không hỗ trợ cùng một tập hợp các tính năng trên mỗi nền tảng.

  2. Hỗ trợ phụ thuộc thư viện/hệ điều hành: Bất kỳ chương trình phức tạp nào đáng kể sẽ cần truy cập hệ thống là một số cách và nhiều tính năng có sẵn trên một hệ thống không khả dụng trên hệ thống kia. Có một triệu ví dụ; chỉ cần nhìn vào như vậy cho tương đương với Linux trống hoặc Windows tương đương trống. Di chuyển ngoài các ứng dụng hỗ trợ hệ điều hành được xây dựng chủ yếu trên các thư viện chức năng và một số trong số đó không có sẵn trên cả hai hệ thống.

1

Không được quá gàn dở, nhưng đang phát triển một chương trình hoàn toàn khác với việc xây dựng nó và thực hiện nó. Trong nhiều trường hợp, một chương trình được viết trên một hệ điều hành có thể được xây dựng và biên dịch để thực hiện trên một hệ điều hành khác. Các chương trình khác, như những người khác đã chỉ ra, dựa vào một số chức năng được cung cấp chỉ bởi một hệ điều hành cụ thể hoặc thư viện cư trú chỉ trên hệ điều hành đó. Kết quả là, nó phải được xây dựng và chạy trên hệ điều hành đó.

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