¿Qué dificulta que el compilador visual de C ++ en Windows genere un archivo ejecutable binario de Linux?
Aparte de la falta de voluntad para hacer eso por parte de Microsoft, absolutamente nada. Los obstáculos no son técnicos.
Las cadenas de herramientas de desarrollo son solo programas que toman datos y producen resultados. Visual C ++ produce un ensamblado x86 y luego usa un ensamblador para convertirlo en un archivo de objeto COFF. Si Microsoft quería que generara ELF, es solo código: el ensamblaje entra, ELF se apaga. No hay nada mágico en los archivos de objetos o bibliotecas; son solo bloques de datos en un formato bien entendido.
En la edad de piedra, la compilación cruzada era mucho más difícil porque la mayoría de las veces, habría estado escribiendo la cadena de herramientas para su plataforma de destino en el ensamblaje de la plataforma donde se ejecutaría. Esto significaba que si todo lo que había en el mundo fueran las arquitecturas VAX, M68K y Alpha, un conjunto completo de compiladores cruzados requeriría escribir nueve de ellos, la mayoría desde cero. (VAX-to-VAX, VAX-to-M68K, VAX-to-Alpha, M68K-to-VAX, M68K-to-M68K, etc.) Eso es un poco exagerado ya que partes del compilador VAX podrían reutilizarse y conectado a generadores de código para cada objetivo (por ejemplo, VAX, M68K y Alpha, cada uno escrito para VAX).
Ese problema desapareció cuando comenzamos a escribir compiladores en un lenguaje que no estaba vinculado a un procesador específico, como C. Seguir esa ruta significa que escribes toda la cadena de herramientas una vez en C y usas una plataforma escrita para la plataforma local. C compilador para construirlo. (A menudo se usa el compilador para volver a compilarse después de haber sido inicializado en el compilador de la plataforma local, pero esa es otra discusión). El resultado de esto es que construir un compilador cruzado se convirtió esencialmente en el mismo esfuerzo que construir un compilador nativo en La plataforma local. La única diferencia significativa es que en algún lugar del proceso de compilación, usted le dijo que compilara en el generador de código para su plataforma de destino en lugar del de la plataforma local, lo que habría sido la elección lógica.
A medida que evolucionó la arquitectura de los compiladores, se volvió conveniente incluir y construir todos los generadores de código con el producto y seleccionar cuál se usa en el tiempo de ejecución. Clang / LLVM hace esto, y estoy seguro de que hay otros.
Una vez que tiene una cadena de herramientas en funcionamiento (compilador, ensamblador, enlazador), las bibliotecas se crean a partir de fuentes y, finalmente, termina con todo lo que necesita para producir un archivo ejecutable para alguna otra plataforma.