qu'est-ce qui rend difficile pour le compilateur visuel C ++ sous Windows de générer un fichier exécutable binaire linux?
À part une réticence à le faire de la part de Microsoft, absolument rien. Les obstacles ne sont pas techniques.
Les chaînes d'outils de développement ne sont que des programmes qui prennent des entrées et produisent des sorties. Visual C ++ produit un assemblage x86, puis utilise un assembleur pour le convertir en un fichier objet COFF. Si Microsoft voulait plutôt le faire générer ELF, c'est juste du code: l'assemblage entre, ELF s'éteint. Il n'y a rien de magique dans les fichiers objets ou les bibliothèques; ce ne sont que des taches de données dans un format bien compris.
À l'époque de la pierre, la compilation croisée était beaucoup plus difficile car, le plus souvent, vous auriez écrit la chaîne d'outils de votre plate-forme cible en l'assemblant pour la plate-forme où elle s'exécuterait. Cela signifiait que si tout ce qu'il y avait dans le monde était les architectures VAX, M68K et Alpha, une suite complète de compilateurs croisés nécessiterait d'en écrire neuf, la plupart à partir de zéro. (VAX à VAX, VAX à M68K, VAX à Alpha, M68K à VAX, M68K à M68K, etc.) C'est un peu exagéré car certaines parties du compilateur VAX pourraient être réutilisées et attaché aux générateurs de code pour chaque cible (par exemple, VAX, M68K et Alpha, chacun écrit pour VAX.)
Ce problème a disparu lorsque nous avons commencé à écrire des compilateurs dans un langage qui n'était pas lié à un processeur spécifique, un tel C.Cette voie signifie que vous écrivez la chaîne d'outils entière une fois en C et utilisez une plate-forme écrite pour la plate-forme locale Compilateur C pour le construire. (Vous utiliseriez souvent le compilateur pour se recompiler après avoir été amorcé sur le compilateur de la plate-forme locale, mais c'est une autre discussion.) Le résultat est que la construction d'un compilateur croisé est devenue essentiellement le même effort que la construction d'un compilateur natif sur la plateforme locale. La seule différence significative est que quelque part dans le processus de construction, vous lui avez dit de compiler dans le générateur de code pour votre plate-forme cible au lieu de celui pour la plate-forme locale, ce qui aurait été le choix logique.
À mesure que l'architecture des compilateurs évoluait, il devenait pratique d'inclure et de construire simplement tous les générateurs de code avec le produit et de sélectionner celui qui sera utilisé au moment de l'exécution. Clang / LLVM fait cela, et je suis sûr qu'il y en a d'autres.
Une fois que vous avez une chaîne d'outils fonctionnelle (compilateur, assembleur, éditeur de liens), les bibliothèques sont construites à partir de sources et, finalement, vous vous retrouvez avec tout ce dont vous avez besoin pour produire un fichier exécutable pour une autre plate-forme.