Điều gì gây khó khăn khi nói trình biên dịch C ++ trực quan trên windows để tạo tệp thực thi nhị phân linux?
Khác với việc không sẵn lòng làm điều đó về phía Microsoft, hoàn toàn không có gì. Những trở ngại không phải là kỹ thuật.
Các công cụ phát triển chỉ là các chương trình lấy đầu vào và sản xuất đầu ra. Visual C ++ tạo ra x86 assembly và sau đó sử dụng một trình biên dịch để chuyển đổi nó thành tệp đối tượng COFF. Nếu Microsoft muốn làm cho nó tạo ELF thay vào đó, thì đó chỉ là mã: lắp ráp, ELF sẽ ra mắt. Không có gì kỳ diệu về các tệp đối tượng hoặc thư viện; chúng chỉ là những đốm dữ liệu ở định dạng được hiểu rõ.
Quay trở lại thời kỳ đồ đá, việc biên dịch chéo khó khăn hơn rất nhiều vì thường thì bạn sẽ viết chuỗi công cụ cho nền tảng mục tiêu của mình để lắp ráp cho nền tảng nơi nó sẽ chạy. Điều này có nghĩa là nếu tất cả những gì có trên thế giới là các kiến trúc VAX, M68K và Alpha, thì một bộ trình biên dịch chéo đầy đủ sẽ yêu cầu viết chín trong số chúng, chủ yếu là từ đầu. (VAX-to-VAX, VAX-to-M68K, VAX-to-Alpha, M68K-to-VAX, M68K-to-M68K, v.v.) Đó là một chút cường điệu vì các phần của trình biên dịch VAX có thể được sử dụng lại và được gắn vào các trình tạo mã cho từng mục tiêu (ví dụ: VAX, M68K và Alpha, mỗi mục được viết cho VAX.)
Vấn đề đó đã biến mất khi chúng tôi bắt đầu viết trình biên dịch bằng ngôn ngữ không gắn với bộ xử lý cụ thể, chẳng hạn như C. Đi theo tuyến đó có nghĩa là bạn viết toàn bộ chuỗi công cụ một lần bằng C và sử dụng nền tảng được viết cho nền tảng cục bộ Trình biên dịch C để xây dựng nó. (Bạn thường sử dụng trình biên dịch để tự biên dịch lại sau khi nó đã được bootstraged trên trình biên dịch của nền tảng cục bộ, nhưng đó là một cuộc thảo luận khác.) Kết quả của việc này là xây dựng trình biên dịch chéo về cơ bản giống như việc xây dựng trình biên dịch gốc nền tảng địa phương. Sự khác biệt đáng kể duy nhất là ở đâu đó trong quá trình xây dựng, bạn đã bảo nó biên dịch trong trình tạo mã cho nền tảng đích của bạn thay vì nền tảng cho nền tảng cục bộ, đó sẽ là lựa chọn hợp lý.
Khi kiến trúc của trình biên dịch phát triển, nó trở nên thuận tiện khi chỉ cần bao gồm và xây dựng tất cả các trình tạo mã với sản phẩm và chọn cái nào được sử dụng trong thời gian chạy. Clang / LLVM làm điều này và tôi chắc chắn có những người khác.
Khi bạn có một toolchain hoạt động (trình biên dịch, trình biên dịch, trình liên kết), các thư viện sẽ được xây dựng từ các nguồn và cuối cùng bạn kết thúc với mọi thứ bạn cần để tạo một tệp thực thi cho một số nền tảng khác.