cosa rende difficile dire al compilatore Visual C ++ su Windows di generare un file eseguibile binario linux?
A parte la riluttanza a farlo da parte di Microsoft, assolutamente nulla. Gli ostacoli non sono tecnici.
Le toolchain di sviluppo sono solo programmi che accettano input e producono output. Visual C ++ produce un assembly x86 e quindi utilizza un assemblatore per convertirlo in un file oggetto COFF. Se Microsoft voleva invece generare ELF, è solo codice: entra l'assemblaggio, ELF esce. Non c'è nulla di magico nei file oggetto o nelle librerie; sono solo blocchi di dati in un formato ben compreso.
Nel lontano passato, la compilazione incrociata era molto più difficile perché il più delle volte avresti scritto la catena di strumenti per la tua piattaforma di destinazione in assemblaggio per la piattaforma in cui sarebbe stata eseguita. Ciò significava che se tutto ciò che c'era al mondo fossero le architetture VAX, M68K e Alpha, una suite completa di cross-compilatori avrebbe richiesto di scriverne nove, principalmente da zero. (VAX-to-VAX, VAX-to-M68K, VAX-to-Alpha, M68K-to-VAX, M68K-to-M68K, ecc.) È un po 'esagerato poiché parti del compilatore VAX potrebbero essere riutilizzate e collegato ai generatori di codice per ciascun target (ad esempio, VAX, M68K e Alpha, ciascuno scritto per VAX.)
Il problema è scomparso quando abbiamo iniziato a scrivere compilatori in una lingua che non era legata a un processore specifico, ad esempio C. Seguire questa strada significa scrivere l'intera toolchain una volta in C e utilizzare una piattaforma scritta per la piattaforma locale Compilatore C per costruirlo. (Utilizzerai spesso il compilatore per ricompilare se stesso dopo che è stato avviato il bootstiler sul compilatore della piattaforma locale, ma questa è un'altra discussione. Il risultato di questo è che costruire un cross-compilatore è diventato essenzialmente lo stesso sforzo di costruire un compilatore nativo su la piattaforma locale. L'unica differenza significativa è che da qualche parte nel processo di compilazione, hai detto di compilare il generatore di codice per la tua piattaforma di destinazione anziché quello per la piattaforma locale, che sarebbe stata la scelta logica.
Man mano che l'architettura dei compilatori si è evoluta, è diventato conveniente includere e creare semplicemente tutti i generatori di codice con il prodotto e selezionare quale viene utilizzato in fase di esecuzione. Clang / LLVM fa questo, e sono sicuro che ce ne sono altri.
Una volta che hai una toolchain funzionante (compilatore, assemblatore, linker), le librerie vengono costruite dai sorgenti e alla fine ottieni tutto il necessario per produrre un file eseguibile per qualche altra piattaforma.