2011-09-15 60 views
8

Tôi là người mới trong lập trình. Từ những gì tôi biết, một chương trình được biên dịch trong Linux sẽ không thể chạy trong Windows. Vì vậy, nếu chúng ta muốn chạy cùng một chương trình trong cả hai nền tảng, chúng ta cần biên dịch mã nguồn theo cả hai nền tảng và tạo ra 2 tệp thực thi khác nhau.(C/C++) Cách tạo tệp thi hành có thể chạy trên cả Windows và Linux?

Gần đây tôi đang nghiên cứu mã nguồn của một ứng dụng Java GUI đa nền tảng nguồn mở. Tôi ngạc nhiên khi thấy rằng công cụ phụ trợ của ứng dụng GUI đó là một tệp thực thi nhỏ được tạo từ các mã C++. Bất kể người dùng nào sử dụng ứng dụng đó trong Windows hoặc Linux, GUI Java sẽ gọi cùng một tệp thi hành trong thư mục bin.

Tôi chỉ muốn biết, tệp thực thi đó chạy trên cả Windows và Linux như thế nào?

Tôi cũng quan tâm đến việc tạo một ứng dụng Java GUI đa nền tảng bằng cách sử dụng chương trình C++ làm công cụ. Chương trình C++ đó chỉ có sẵn cho Linux. Tôi đã googling một lúc và tôi thấy rằng tôi cần phải sử dụng Cygwin để chuyển nó vào Windows. Tuy nhiên, nếu tôi sử dụng Cygwin, tôi sẽ kết thúc có 2 tập tin thực thi khác nhau.

Làm cách nào để kết hợp tệp thi hành Windows với tệp thi hành Linux? Có thể tạo một tệp thực thi duy nhất có thể chạy trên cả hai nền tảng không?

Cảm ơn.

+1

Sẽ rất hữu ích khi biết bạn đã nghiên cứu ứng dụng nguồn mở nào để chúng tôi có thể xem nó. –

+0

Xin chào Mark, cảm ơn. Bạn có thể tải xuống ứng dụng đó tại đây: http://xjperf.googlecode.com/files/jperf-2.0.2.zip. –

+0

http://lbw.sourceforge.net/ – Flexo

Trả lời

8

Không có cách nào để có một tệp thực thi gốc duy nhất được biên dịch từ nguồn C++ hoạt động trên các nền tảng khác nhau. Tôi không tin bạn rằng cùng một tệp thực thi được chạy trên Windows và Linux, khi bạn nêu trong đoạn thứ hai của mình.

+0

Câu hỏi nêu rõ rằng ứng dụng được quan sát là C++, không phải Java, nó chỉ được bắt đầu thông qua giao diện người dùng Java. Và tôi nghĩ đã có các tệp thực thi có thể chạy trên cả Windows và Mac. –

+0

@Mark Cùng thực thi trên Windows và Mac? Tôi không nghĩ vậy. –

8

Câu trả lời đơn giản là, bạn không thể.

Định dạng thực thi nhị phân PE (Windows) và ELF (Linux) hoàn toàn khác nhau.

Chưa kể rằng Chương trình C/C++ yêu cầu liên kết đến các thư viện sẽ không có sẵn trên một trong hai nền tảng cùng một lúc.

Tuy nhiên, bạn có thể sử dụng Wine trên Linux để chạy tệp thực thi Windows, cung cấp nó không thử các cuộc gọi cụ thể của Windows. Hoặc bạn có thể chọn sử dụng một ngôn ngữ đa nền tảng "phổ biến" hơn như ngôn ngữ CLI (C#/IronPython/Java, v.v.) mà .NET cho Windows và Mono dành cho Linux/những người khác hỗ trợ.

0

Bạn không thể làm điều đó ... tức là. bạn không thể chạy cùng một tệp thực thi trên cả Unix lẫn Windows.

Windows sử dụng tệp thi hành, trong khi Unix sử dụng định dạng tệp elf. Về cơ bản chúng khác nhau. Không giống như Java đối tác nơi bạn có thể chạy cùng một tệp thực thi (bytecode) trên cả hai máy, do đó sử dụng một trình thông dịch (JVM) để thực hiện.

Bây giờ, nói rằng bạn có hai lựa chọn ...

  1. Hoặc bạn thực sự có thể cài đặt các trình biên dịch C trên cả Windows và Linux (unix) và sau đó biên dịch mã của bạn trên cả trong số họ.
  2. Hoặc bạn có thể cài đặt 'Wine', một phần mềm porting trên linux mà sẽ có thể thực sự chạy các tập tin thực thi windows trên linux bằng cách thi đua Windows.

Có thể, tùy chọn số 2 sẽ phù hợp hơn ... Cuộc gọi của bạn ...

Trân trọng,

3

Nói một cách đơn giản, không thể chạy cùng một tệp thực thi trên các nền tảng khác nhau. Điều này đúng với Windows, Linux hoặc bất kỳ nền tảng UNIX nào khác.

Ý tưởng về việc có một tệp thực thi duy nhất không có gì mới mẻ và là ý tưởng đằng sau Java Runtime và Windows .Net (Mono cho Linux). Bản thân chúng dựa vào các tệp thi hành khác nhau được biên dịch trên các máy cụ thể.

Bất kể người dùng nào sử dụng ứng dụng đó trong Windows hoặc Linux, GUI Java sẽ gọi cùng một tệp thi hành trong thư mục bin.

Chúng đơn giản có thể sử dụng đường dẫn có liên quan đến các tệp thi hành này và các tệp thi hành này có thể được biên dịch riêng trên các nền tảng khác nhau. Khó mà nói mà không nhìn vào mã.

Cygwin là giao diện dòng lệnh trên cửa sổ cung cấp giao diện UNIX.

Một tùy chọn để thử là Wine là chương trình dành cho Linux để chạy các chương trình cửa sổ trên Linux.

+0

"Windows Linux"? Giống như [Lindows] (http://en.wikipedia.org/wiki/Linspire)? – genpfault

+0

Tôi đang cố chỉnh sửa. Máy chủ tiếp tục chết trên tôi. –

2

Có thể, nếu các hệ điều hành trên cùng một nền tảng.

Tuy nhiên, Linux có thể chạy trên nhiều nền tảng với các bộ xử lý khác nhau: VAX, MAC, PC, Sun vv

Một vấn đề là một thực thi chứa assembly (mã máy) hướng dẫn cụ thể cho một bộ xử lý. Mã máy để thêm thanh ghi bằng bộ xử lý ARM có thể khác với bộ xử lý Motorola, Intel hoặc Sun. Vì vậy, với bối cảnh này, một thực thi có thể không được đảm bảo để chạy trên các nền tảng khác nhau.

Một vấn đề khác là thư viện thời gian chạy cũng có thể thực hiện cuộc gọi đến các chức năng OS cụ thể (như mở tệp, hiển thị văn bản, v.v.) Một số hệ điều hành có thể không cung cấp chức năng tương tự; trong khi những người khác có một phương pháp khác để thực thi cùng một chức năng. Hệ điều hành trên nền tảng nhúng có thể không hỗ trợ hệ thống tệp. Windows Vista có thể chặn cuộc gọi từ các yêu cầu MSDOS không an toàn.

Các ngôn ngữ khác trở thành nền tảng độc lập bằng cách tạo mã được thực thi bởi "máy ảo". Mã không được thực hiện trực tiếp bởi một bộ xử lý.

Phương pháp truyền thống để chuyển các phương thức C và C++ là cung cấp nguồn và cho phép khách hàng xây dựng phần mềm trên nền tảng của họ. Các quy trình phân phối khác là tạo một tệp thực thi cho mọi nền tảng được hỗ trợ; điều này trở thành một cơn ác mộng bảo trì.

+0

Tạo một tệp thực thi cho mọi nền tảng được hỗ trợ không phải là một cơn ác mộng bảo trì. Đây là thực tế phổ biến cho hầu hết mọi chương trình ngoài kia, thương mại hay không. Xây dựng các tệp thi hành này là một quá trình tự động dễ dàng. –

0

Bạn không thể tải chương trình C++ là các thư viện hiện có tương ứng bằng #ifdef? Tôi nghĩ đó là giải pháp C++ cho các chương trình nền tảng chéo. Tuy nhiên, mã cần được điều chỉnh để làm việc với cả hai hoặc tất cả các thư viện đã chọn.

Tuy nhiên không có giao diện người dùng java hoặc 2 tệp nhị phân khác nhau hoặc dơi và sh hoặc chương trình như rượu, bạn sẽ không thể chạy nhị phân tương ứng.

0

Nếu bạn tạo ứng dụng MS Windows hoạt động tốt, nó có thể chạy chưa được sửa đổi trên nền tảng Linux x86 bằng cách sử dụng tiện ích wine.

Wine là một lớp tương thích mà cung cấp Win32 và liên quan đến các cuộc gọi thư viện runtime để chương trình nghĩ rằng nó đang chạy trên MS Windows, nhưng lớp rượu dịch những thành Linuxisms với hiệu suất thực sự tốt.

Chi tiết khác tại http://www.winehq.org/

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