c++ - ejecutar - instalar gcc en ubuntu
¿Es posible compilar un código fuente de C/C++ que se ejecute en todas las distribuciones de Linux sin recompilación? (3)
Generalmente no.
Hay varios bariers.
Diferentes arquitecturas
Mientras que un binario de 32 bits se ejecutará en un sistema x86_64, no funcionará a la inversa. Además hay una gran cantidad de sistemas ARM.
Kernel ABI
Kernel ABI cambia muy lentamente, pero sí cambia, por lo tanto, realmente no puede soportar todas las versiones posibles. Tenga en cuenta que en algunos lugares el kernel 2.2 todavía está en uso.
Lo que puedes hacer es crear un binario enlazado estáticamente. Dicho binario incluirá todas las bibliotecas de las que depende su aplicación, y funcionará en todos los sistemas con la misma arquitectura y una versión del kernel razonablemente similar.
¿Es posible compilar un código fuente de C / C ++ que se ejecute en todas las distribuciones de Linux sin recompilación?
Si la respuesta es sí, ¿puedo usar alguna biblioteca externa (no estándar de C / C ++)?
Quiero distribuir mi aplicación binaria en lugar de distribuir el código fuente.
Hay dos diferencias que hay entre las instalaciones. Arquitectura y bibliotecas.
Tener un binario para diferentes arquitecturas no es directamente posible; hubo un intento de tener binarios para múltiples archs en un archivo ( fatelf ), pero no se usa ampliamente y es poco probable que gane impulso. Así que al menos tienes que distribuir binarios separados para ia32, amd64, arm, ... (aunque la mayoría de las distribuciones de amd64 tienen el kernel compilado con soporte para ejecutar el código ia32)
Las distribuciones contienen diferentes versiones de bibliotecas. Usted está bien siempre y cuando la API no cambie, puede vincular a esa biblioteca. Algunas libretas garantizan la compatibilidad inversa con el número principal (por lo que la aplicación GTK2.2 funcionará bien con la libra GTK2.30, pero no necesariamente al revés). Si quiere estar seguro, debe vincularse de forma estática con todas las bibliotecas que utilice, excepto las más básicas (probablemente solo
libc6
, que es compatible con binarios entre las distribuciones AFAIK). Esto puede aumentar el tamaño del binario, y es una de las razones por las que, por ejemplo, Acrobat Reader es una descarga relativamente grande, aunque la aplicación en sí no es especialmente rica en cuanto a funcionalidad.Hubo un período de transición para c ++ ABI, que cambió entre gcc 2.9 y 3 (IIRC), pero el antiguo ABI sería realmente solo en instalaciones antiguas. Esto ya no debería ser un problema para usted, y si lo vincula estáticamente, es irrelevante de todos modos.
No, no puede compilar un ejecutable que se ejecute en todas las distribuciones de Linux. Sin embargo, puede compilar un ejecutable que funcione en la mayoría de las distribuciones que las personas tienden a preocuparse.
Compilar 32 bits. Compila para el nivel mínimo de CPU que estás dispuesto a soportar.
Construye tu propia versión de glibc. Use la opción
--enable-kernel
para establecer la versión mínima de kernel que está dispuesto a admitir.Compila todas las demás bibliotecas que planeas usar tú mismo. Utilice los encabezados de su compilación de glibc y las banderas de su compilador / CPU elegidas.
Enlace estáticamente.
Para cualquier cosa que no pueda vincular estáticamente (por ejemplo, si necesita acceder a la resolución de nombres predeterminada del sistema o necesita PAM), debe diseñar su propio proceso de ayuda y API. Libere la fuente al proceso de ayuda y deje que ellos (o su instalador) lo compilen.
Prueba a fondo en todas las plataformas que necesitas soportar.
Es posible que deba ajustar algunas bibliotecas si llaman a funciones que no pueden funcionar con este mecanismo. Eso incluye dlopen
, gethostbyname
, iconv_open
, etc. (Este tipo de funciones se basan fundamentalmente en la vinculación dinámica. Vea el paso 5 más arriba. Recibirá una advertencia cuando haga el enlace para estas).
Además, las zonas horarias tienden a romperse si no tiene cuidado porque su código puede no entender el formato de zona del sistema o las ubicaciones de los archivos de zona. (No recibirá ninguna advertencia para esto. Simplemente no funcionará.)
La mayoría de las personas que hacen esto están compilando con la CPU mínima admitida que es un Pentium 4 y la versión mínima de kernel admitida es 2.6.0.