Có thể sử dụng trình biên dịch Intel C / C ++ trên Linux để tạo các tệp đối tượng được liên kết trên Windows không?


12

Tại sao?

Tùy thuộc vào nguồn của bạn, trình biên dịch Intel có khả năng hoặc chắc chắn nhất là trình biên dịch tạo ra các tệp thực thi nhanh nhất cho kiến ​​trúc x86 (cải thiện thời gian thực hiện 5 đến 100%).

Intel cung cấp các trình biên dịch cho Linux theo giấy phép phi thương mại miễn phí (Tôi nghĩ rằng tôi đọc nó miễn phí ở đâu đó trên trang của họ: Intel - Phát triển phần mềm phi thương mại ). Ngoài ra còn có giấy phép phi thương mại miễn phí cho sinh viên, nhưng giấy phép này không được áp dụng mặc dù các công cụ được cung cấp cho cả ba hệ điều hành chính (liên kết bị rớt do hạn chế danh tiếng).

Mục tiêu

Tôi (không phải là sinh viên) muốn có thể sử dụng trình biên dịch Intel để cải thiện tốc độ thực thi có thể theo giấy phép phi thương mại để biên dịch các tệp đối tượng có thể được liên kết để tạo thư viện thực thi và thư viện liên kết động cho Windows (và có thể cả HĐH X)

Thêm chi tiết:

Những gì tôi suy ra từ này tài liệu là các trình biên dịch Intel tạo ra các file đối tượng đó là tương thích với các trình biên dịch nổi trội của nền tảng này.

Câu hỏi phụ:

  1. Các định dạng tệp đối tượng của gcc, g ++, cl, mingw32, icc, icpc và icl trên Windows và Linux (phiên bản hiện tại) là gì?
  2. Các phần của chuỗi công cụ biên dịch chéo mingw32 có thể được sử dụng để hoàn thành mục tiêu không?
  3. Tôi có đúng rằng siêu dữ liệu trong các tệp đối tượng được tạo là vấn đề chính không?

quảng cáo 2:
mingw32-objcopy dường như có thể chuyển đổi đầu ra trình biên dịch Intel trên Linux (có lẽ là ELF) sang COFF tương thích với Microsoft (ngoại trừ các tệp đối tượng có thể định vị lại được). Ai đó có thể xác nhận rằng điều này thực sự hoạt động (đối với các ứng dụng không tầm thường), xin vui lòng?


1
+1. Câu hỏi thú vị.
Neil

Bạn đã nhìn vào Wine? AFAIK, Wine cung cấp một chuỗi công cụ có thể xây dựng các tệp thực thi Windows trên Linux; hoàn toàn có thể bạn có thể treo icc lên với điều đó. Bạn cũng có thể có một số thành công khi chạy Windows icc bên trong Wine và kết nối với chuỗi công cụ biên dịch chéo ming32. Tôi đã không thử nó, nhưng với đủ khó khăn, tôi nghĩ rằng nó nên có thể.
tdammers

@tdammers Theo WineHQ , chuỗi công cụ để xây dựng các tệp thực thi Windows trên Linux là mingw32, nếu tôi không nhầm.
Hugo

Từ các diễn đàn của Intel, câu trả lời dường như là "không": software.intel.com/en-us/forums/topic/282588
Vitor Py

@VitorBraga Tôi đã giải thích câu hỏi như thế này: "Trình biên dịch Intel có khả năng biên dịch chéo trực tiếp không?" Câu trả lời là "Không" (nó thiếu các tùy chọn và thư viện cần thiết, theo như tôi có thể nói), nhưng ... kiến ​​trúc máy tính (IA32, AMD64) sẽ giống nhau trong trường hợp của tôi và nếu tôi chỉ sử dụng các thư viện Windows để biên dịch chương trình trong Linux, tôi mong đợi có được mã thực thi có thể được thực thi trong Windows - nếu được liên kết với các thư viện Windows để tạo tệp thực thi Windows.
Hugo

Câu trả lời:


1

Có thể tạo các tệp thực thi Windows trên máy xây dựng Linux bằng cách sử dụng trình biên dịch chéo. Nhưng, Intel không cung cấp trình biên dịch chéo như vậy.

Để trả lời các câu hỏi phụ:

Các định dạng tệp đối tượng của gcc, g ++, cl, mingw32, icc, icpc và icl trên Windows và Linux (phiên bản hiện tại) là gì?

Định dạng cho các tệp đối tượng được xác định một cách hiệu quả bởi hệ điều hành (hay đúng hơn là trình biên dịch được sử dụng để xây dựng nó). Đối với Windows, đây là định dạng Portable Executable (PE) và cho Linux định dạng ELF .

Các phần của chuỗi công cụ biên dịch chéo mingw32 có thể được sử dụng để hoàn thành mục tiêu không?

Không. Phần có liên quan là trình tạo mã, cả hai phần chịu trách nhiệm tạo định dạng đối tượng phù hợp và phần trên trình biên dịch Intel cung cấp cho mã được tạo của họ cạnh tốc độ.

Tôi có đúng rằng siêu dữ liệu trong các tệp đối tượng được tạo là vấn đề chính không?

Không. Đây là một vấn đề, nhưng có nhiều hơn. Một vấn đề cơ bản hơn là sự khác biệt tiềm năng trong cách các tham số được truyền đến kernel và / hoặc thư viện chuẩn. IIRC, những quy ước đó là khác nhau giữa Windows và Linux.


0

Câu trả lời gần như chắc chắn là có. Tôi biết rằng các tệp nhị phân Windows biên dịch chéo (thông qua mingw32 ) trên hộp Linux có thể dễ dàng sử dụng gcc - rõ ràng bạn sẽ không thể chạy chương trình trên Linux (trừ khi nó hoạt động trong Wine), nhưng tôi biết một số chương trình có được Windows nhị phân theo cách này.

Tuy nhiên, tôi không biết trình biên dịch Intel có các tùy chọn cho việc này không, tôi nên nghĩ rằng nó có.

Định dạng đối tượng cho Windows là PE , trong khi đối với Linux ELF của nó .


Theo msdn : "Trình biên dịch tạo ra các tệp đối tượng Định dạng tệp đối tượng chung (COFF) (.obj)." <br/>
Hugo

OK, nó không hoạt động. Theo Wikipedia PE có nguồn gốc từ COFF và cả hai định dạng tệp có thể được sử dụng làm định dạng tệp đối tượng và định dạng tệp thực thi.
Hugo

0

Với mã C liên kết với không có gì (trực tiếp) sử dụng các quy ước gọi điện tùy chỉnh của Microsoft, bạn có thể có cơ hội sử dụng MinGW objcopy. Tôi đã sử dụng nó để chuyển đổi một tệp đối tượng được lắp ráp, nhưng sau đó tôi không phải lo lắng về việc gọi các quy ước.

Tôi sẽ chỉ dành thời gian bạn sẽ cố gắng làm điều này thay vì nhận GCC hoặc kêu vang để làm chính xác những gì bạn muốn. Nếu việc tăng tốc như vậy thực sự quan trọng thì biên dịch nhị phân Linux với trình biên dịch Intel và cố gắng xem chính xác những gì, nếu có bất cứ điều gì, nó sẽ tăng tốc mã của bạn. Bạn có thể vá lắp ráp nếu tất cả những thứ khác không thành công.


0

Tôi đề xuất câu trả lời sau:

Một định nghĩa có thể (nghiêng về có) với một nhưng liên quan đến bối cảnh.

Giải thích: Về phần "nghiêng": Có vẻ như không lãng phí thời gian để thử điều này, nhưng (phần "đặt") có tính đến câu trả lời này, bạn có thể sẽ không cải thiện thời gian thực hiện so với Intel -Chỉ là chuỗi công cụ. Phần có liên quan là trình liên kết và phản hồi thời gian chạy cho trình biên dịch (tối ưu hóa toàn bộ chương trình, tối ưu hóa theo hướng dẫn hồ sơ, tạo mã thời gian liên kết).

Chi tiết bổ sung:
Theo Câu hỏi thường gặp của MinGW, có thể có các vấn đề khi sử dụng thư viện và DLL:
"Mặc dù các dll được cho là khá di động trên các trình biên dịch Windows khác nhau, nhưng việc truy cập dll thông qua tệp thư viện (.lib hoặc .a) thì không. định dạng tệp dành riêng cho các trình biên dịch cụ thể và không thể được sử dụng một cách hợp lý với các trình biên dịch khác nhau trừ khi trình biên dịch cung cấp hỗ trợ cho nó. "

Để hoàn thành câu trả lời:
câu hỏi phụ 1:

Các định dạng tệp đối tượng của gcc, g ++, cl, mingw32, icc, icpc và icl trên Windows và Linux (phiên bản hiện tại) là gì?

Định dạng tệp đối tượng mặc định cho bất kỳ trình biên dịch nào trên Windows là COFF (có thể là biến thể PE ). Định dạng tệp đối tượng mặc định cho mọi trình biên dịch trên Linux là ELF

câu hỏi phụ 2:

Các phần của chuỗi công cụ biên dịch chéo mingw32 có thể được sử dụng để hoàn thành mục tiêu không?

Rất có thể là có (đối với phần liên kết), nhưng rất có thể bạn sẽ không nhận được nhiều cải thiện thời gian thực hiện.

câu hỏi phụ 3:

Tôi có đúng rằng siêu dữ liệu trong các tệp đối tượng được tạo là vấn đề chính không?

Về liên kết: có.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.