2013-01-13 32 views
7

Trước tiên, tôi muốn ghi lại rằng câu hỏi này có liên quan đến trường học/bài tập về nhà.Khả năng tương thích tệp đối tượng C giữa các máy tính

Giả sử máy tính CP1 và CP2 đều dùng chung một hệ điều hành và ngôn ngữ máy. Nếu một chương trình C được biên dịch trên CP1, để di chuyển nó sang CP2, cần phải chuyển mã nguồn và biên dịch lại trên CP2 hay đơn giản là chuyển các tệp đối tượng.

Câu trả lời ruột của tôi là các tệp đối tượng phải đủ. Mã C được dịch thành assembly bởi trình biên dịch và được lắp ráp thành mã máy bởi trình biên dịch. Bởi vì kiến ​​trúc chia sẻ cùng một mã máy và hệ điều hành, tôi không thấy vấn đề gì.

Nhưng càng suy nghĩ về điều đó, tôi càng bắt đầu cảm thấy bối rối hơn.

Câu hỏi của tôi là:

a) Kể từ khi giới thiệu nó cho đối tượng tập tin và không thực thi, tôi giả định rằng không có sự liên kết. Liệu có bất kỳ vấn đề nào xuất hiện khi liên kết trên CP2?

b) Có vấn đề gì nếu mã sử dụng chuẩn C11 trên CP1 nhưng trình biên dịch duy nhất trên CP2 là C99? Tôi giả định điều này là không liên quan khi mã đã được biên dịch/lắp ráp.

c) Câu hỏi không chỉ định thư viện được liên kết/chia sẻ động. Vì vậy, điều này sẽ chỉ thực sự hoạt động nếu chương trình không phụ thuộc vào các tập tin .dll/.so/.dylib, hoặc những người khác cũng sẽ được yêu cầu trên CP2.

Tôi cảm thấy như có rất nhiều gotchas, và xem xét làm thế nào mơ hồ câu hỏi là bây giờ tôi cảm thấy rằng nó sẽ được an toàn hơn để chỉ đơn giản là biên dịch lại.

Halp!

+0

distcc, sao chép tệp đối tượng giữa các máy tính, đề xuất sử dụng cùng một phiên bản trình biên dịch trên tất cả các nút, ngay cả đối với ngôn ngữ C. – aschepler

Trả lời

3

Câu trả lời là tùy thuộc. Khi bạn biên dịch một chương trình C và di chuyển các tệp đối tượng để liên kết trên một máy tính khác, nó sẽ hoạt động. Nhưng vì các yếu tố như endianness hoặc name mangling, chương trình của bạn có thể không hoạt động như dự định và thậm chí có thể gặp sự cố khi bạn cố gắng chạy.

C11 không được hỗ trợ bởi trình biên dịch C99, nhưng nó không quan trọng nếu nguồn đã được biên dịch và lắp ráp.

Miễn là nguồn được biên dịch với thư viện trên một máy, bạn không cần thư viện liên kết hoặc chạy tệp trên máy tính khác (thư viện tĩnh chỉ, thư viện động sẽ phải trên máy tính bạn chạy ứng dụng trên). Điều này nói rằng, bạn nên làm cho chương trình độc lập, do đó bạn không chạy vào các vấn đề tương tự như trước khi chương trình không hoạt động như dự định hoặc bị treo.

Bạn có thể nhận được trình biên dịch hỗ trợ EABI để bạn không gặp phải các sự cố này. Các trình biên dịch hỗ trợ EABI tạo mã đối tượng tương thích với mã được tạo bởi các trình biên dịch khác, do đó cho phép các nhà phát triển liên kết các thư viện được tạo với một trình biên dịch với mã đối tượng được tạo bằng trình biên dịch khác.

Tôi đã cố gắng làm điều này trước đây, nhưng không phải là toàn bộ, và không phải gần đây. Do đó, thông tin của tôi có thể không chính xác 100%.

+0

"Bạn không cần thư viện" - điều đó chỉ đúng đối với liên kết tĩnh. Các lib động chỉ được tham chiếu bởi chương trình của bạn, không được biên dịch vào nó. Chương trình sẽ không bắt đầu nếu chúng bị thiếu. –

+0

Cảm ơn bạn đã đánh bắt, chỉnh sửa được thực hiện. – syb0rg

+0

Vòng quay 2 của bạn là đáng kể, bạn nên đề cập đến khả năng tương thích thời gian chạy và mang tên, có các hệ thống nơi bạn có thể thực sự yêu cầu các loại đầu ra tệp đối tượng khác nhau, khi [ABI] mới (http://en.wikipedia.org/wiki/Application_binary_interface) là tốt hơn rất nhiều mà nó có giá trị viết lại toolchain để có được nó. – jthill

1

a) Tôi đã nghe thuật ngữ "tệp đối tượng" được sử dụng để tham chiếu đến tệp nhị phân được liên kết - mặc dù nó không chính xác. Vì vậy, có lẽ họ có nghĩa là "nhị phân".Tôi muốn nói liên kết trên một máy khác nhau có thể có vấn đề nếu nó có một trình biên dịch khác nhau - trừ khi định dạng tệp đối tượng được chuẩn hóa, mà tôi không chắc chắn về.

b) Sử dụng các tiêu chuẩn khác nhau hoặc thậm chí trình biên dịch không quan trọng đối với mã nhị phân - nếu được liên kết tĩnh. Nếu nó dựa trên các chức năng từ một lib động, có thể có vấn đề. Câu trả lời nào c): Vâng, đây sẽ là một vấn đề. Chương trình sẽ không bắt đầu nếu nó không có tất cả các lib động được yêu cầu trong phiên bản chính xác. Phụ thuộc vào chế độ liên kết (tĩnh so với động), một lần nữa.

0

Q: Giả sử các máy tính CP1 và CP2 đều dùng chung một hệ điều hành và ngôn ngữ máy.

A: Sau đó, bạn có thể chạy của .exe nhau trên cả hai máy tính

Q: Nếu một chương trình C được biên soạn trên CP1, để di chuyển nó đến CP2, nó là cần thiết để chuyển mã nguồn

A: Không. Bạn chỉ cần mã nguồn nếu bạn muốn biên dịch lại. Bạn chỉ cần biên dịch lại nếu đó là CPU và/hoặc hệ điều hành không tương thích, khác nhau.

"file Object" thường không cần thiết ở tất cả để thực hiện chương trình:

http://en.wikipedia.org/wiki/Object_files

Một tập tin đối tượng là một tập tin chứa máy định dạng định vị đang mà thường là không trực tiếp thực thi. Tệp đối tượng được tạo bởi trình biên dịch, trình biên dịch hoặc trình dịch ngôn ngữ khác và được sử dụng làm đầu vào cho trình liên kết.

Một "chương trình thực thi" có thể cần một hoặc nhiều "thư viện được chia sẻ" (aka .dll's). Trong trường hợp đó, các hạn chế tương tự sẽ được áp dụng: các thư viện được chia sẻ, nếu chưa được cư trú, phải được sao chép cùng với .exe và cũng phải tương thích với CPU và OS.

Cuối cùng, "tập lệnh" làm không cần phải được biên dịch lại. Bạn có thể sao chép kịch bản một cách tự do từ máy tính đến máy tính. Nhưng mỗi máy tính phải có một "thông dịch viên" để chạy kịch bản: một kịch bản Perl cần một trình thông dịch Perl, một kịch bản Python một trình thông dịch python, và cứ thế.

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