El proceso de construir un binario para una arquitectura diferente a la que estás utilizando se llama compilación cruzada.
Como se destaca en las otras respuestas, esto es una ocurrencia relativamente común, especialmente en la historia de Apple que cambió de procesadores 68K a Power PC, luego a Intel y ahora a ARM.
Cabe destacar que cualquiera que construya una aplicación para iPhone o iPad en su Mac ha estado haciendo compilación cruzada, ya que estos dispositivos ya utilizan la arquitectura ARM mientras que las Mac actualmente utilizan la arquitectura Intel. Incluso es común construir aplicaciones iOS multiarquitectura, ya que varias versiones de CPU realmente utilizan variantes diferentes de la arquitectura ARM (armv7, armv8...).
De igual manera, es común construir variantes i386 (Intel 32 bits) y amd64/x64 (Intel 64 bits), ya sea de forma independiente o como binarios gordos/universales.
El proceso para compilar cruzadamente y construir binarios gordos/universales depende mucho del entorno y de la herramienta que utilices. Si usas Xcode, entonces será cuestión de cambiar la configuración del proyecto, y ¡voilà!, está hecho.
Si estás utilizando herramientas tipo Unix (principalmente en la línea de comandos), incluyendo make o variantes, gcc o clang, etc, entonces puede requerir más o menos ajustes en tu proceso de construcción para lograr todo eso, con bastantes opciones para cambiar (arquitectura, pero también rutas de archivos de cabecera y bibliotecas), así como agregar el paso que combina los múltiples binarios dependientes de la arquitectura en un único binario gordo/universal.
Así que realmente todo depende de tu proceso de construcción actual y de las herramientas que utilices. Pero definitivamente será posible.
Por supuesto, todo esto se basa en que el código a compilar sea realmente portátil, es decir, no haga suposiciones sobre cosas (como tamaños de enteros o punteros) y no requiera ningún código en ensamblador. Eso solía ser un gran problema en el pasado (especialmente con código puro en C), pero hoy en día, con la cantidad de arquitecturas para las que actualmente se construye software, es mucho menos común encontrarse con problemas de este tipo.
0 votos
Para el primer paso de validar su programa de línea de comandos en ARM, compílelo para la Raspberry Pi u otra SBC basada en ARM similar. Esto atrapará todo tipo de errores de portabilidad. Incluso podría lograr que su interfaz gráfica funcione compilando el siguiente paso. Esto no garantiza atrapar cada problema, pero muchos de ellos se mostrarán temprano (junto con cualquier problema de Linux vs. Darwin que quizás no le importe).
0 votos
El formato de MacOS para archivos ejecutables, que yo sepa, no permite tener múltiples arquitecturas en el mismo binario. Por lo tanto, necesitas compilación separada.
1 votos
Uh @ThorbjørnRavnAndersen, un binario de arquitectura múltiple se llama fat. sin embargo, ningún compilador los crea por lo que necesitas compilación separada y luego unirlos.
1 votos
@hildred Lo busqué. Mach-O admite múltiples arquitecturas en sí mismo, por lo que "solo" requiere la cadena de herramientas del compilador para generarlas. es.wikipedia.org/wiki/Mach-O#Binarios_multiarquitectura
0 votos
@ThorbjørnRavnAndersen, correcto, pero según tengo entendido, ningún compilador crea binarios multiarquitectura, por lo tanto, un binario Mach-O delgado es el predeterminado. Pero con varios compiladores puedes combinarlos para crear un binario Mach-O gordo.