ทำให้ยากที่จะพูดคอมไพเลอร์ Visual C ++ บน windows เพื่อสร้างไฟล์ปฏิบัติการไบนารี linux อะไร
นอกเหนือจากความไม่เต็มใจที่จะทำเช่นนั้นในส่วนของ Microsoft ไม่มีอะไรแน่นอน อุปสรรคไม่ใช่เรื่องเทคนิค
ชุดเครื่องมือการพัฒนาเป็นเพียงโปรแกรมที่รับอินพุตและสร้างเอาต์พุต visual c ++ สร้างแอสเซมบลี x86 และใช้แอสเซมเบลอร์เพื่อแปลงนั้นลงในวัตถุวัตถุ COFF ถ้า Microsoft ต้องการให้มันสร้าง ELF แทนมันเป็นแค่รหัส: แอสเซมบลีเข้ามา ELF ก็ดับแล้ว ไม่มีอะไรมหัศจรรย์เกี่ยวกับไฟล์วัตถุหรือไลบรารี พวกมันเป็นเพียงข้อมูลในรูปแบบที่เข้าใจกันดี
ย้อนกลับไปในยุคหินการรวบรวมข้ามเป็นเรื่องยากมากเพราะบ่อยครั้งกว่าที่คุณจะได้เขียนเครื่องมือโซ่สำหรับแพลตฟอร์มเป้าหมายของคุณในการประกอบสำหรับแพลตฟอร์มที่มันจะทำงาน นี่หมายความว่าหากสิ่งที่มีในโลกคือ VAX, M68K และสถาปัตยกรรมอัลฟ่าชุดคอมไพเลอร์ข้ามเต็มรูปแบบจะต้องเขียนเก้าของพวกเขาส่วนใหญ่ตั้งแต่เริ่มต้น (VAX-to-VAX, VAX-to-M68K, VAX-to-Alpha, M68K-to-VAX, M68K-to-M68K ฯลฯ ) นั่นเป็นการพูดเกินจริงเล็กน้อยเนื่องจากชิ้นส่วนของคอมไพเลอร์ VAX สามารถนำมาใช้ใหม่และ แนบกับตัวสร้างโค้ดสำหรับแต่ละเป้าหมาย (เช่น VAX, M68K และ Alpha แต่ละอันเขียนขึ้นสำหรับ VAX)
ปัญหานั้นหายไปเมื่อเราเริ่มเขียนคอมไพเลอร์ในภาษาที่ไม่ได้ผูกติดอยู่กับหน่วยประมวลผลเฉพาะเช่นซีการไปที่เส้นทางนั้นหมายความว่าคุณเขียน toolchain ทั้งหมดครั้งเดียวใน C และใช้แพลตฟอร์มที่เขียนเพื่อท้องถิ่น คอมไพเลอร์ C เพื่อสร้างมัน (คุณมักจะใช้คอมไพเลอร์เพื่อคอมไพล์ตัวเองใหม่หลังจากที่มันถูก bootstrapped บนคอมไพเลอร์แพลตฟอร์มของท้องถิ่น แต่นั่นคือการอภิปรายอื่น) ผลที่สุดของเรื่องนี้คือการสร้าง cross-compiler กลายเป็นความพยายามเช่นเดียวกับการสร้างคอมไพเลอร์ดั้งเดิม แพลตฟอร์มท้องถิ่น ความแตกต่างที่สำคัญเพียงอย่างเดียวคือกระบวนการสร้างคุณบอกให้รวบรวมในตัวสร้างรหัสสำหรับแพลตฟอร์มเป้าหมายของคุณแทนที่จะเป็นหนึ่งในแพลตฟอร์มท้องถิ่นซึ่งจะเป็นตัวเลือกเชิงตรรกะ
เมื่อสถาปัตยกรรมของคอมไพเลอร์ถูกพัฒนามันก็สะดวกที่จะรวมและสร้างตัวสร้างโค้ดทั้งหมดด้วยผลิตภัณฑ์และเลือกสิ่งที่ถูกใช้ในรันไทม์ Clang / LLVM ทำสิ่งนี้และฉันมั่นใจว่ามีคนอื่น
เมื่อคุณมี toolchain ที่ใช้งานได้ (คอมไพเลอร์, แอสเซมเบลอร์, ตัวเชื่อมโยง) ไลบรารีจะถูกสร้างขึ้นจากแหล่งข้อมูลและในที่สุดคุณก็จะได้ทุกสิ่งที่คุณต้องการในการสร้างไฟล์ปฏิบัติการสำหรับแพลตฟอร์มอื่น