2009-11-04 12 views
10

La solución enCómo compilar un binario de 32 bits en la maquina Linux de 64 bits sin tocar el entorno CFLAGS variables

How to compile a 32-bit binary on a 64-bit linux machine with gcc/cmake

no es posible porque el uso de software de terceros tercero y otras cosas que es usando la variable CFLAGS ya. Y no se permite parchar sus archivos make - dice mi jefe.

Así que tengo que encontrar otra manera de hacer cumplir. Tal vez algo de magia con enlaces simbólicos redireccionando una llamada a gcc a una versión de 32 bits del compilador (esperando que el objetivo predeterminado no se detecte dinámicamente).

+0

¿Es este "software de terceros y otras cosas" una dependencia que necesita compilarse también cuando construyes tu binario de 32 bits? –

Respuesta

14

No tiene permitido cambiar CFLAGS en su entorno, pero ¿hay alguna razón por la que no pueda anular temporalmente la construcción?

Para un paquete basado en AutoTool, yo intentaría primero:

CFLAGS="-m32" ./configure [opts] 
make 
make install 

Un archivo configure.ac bien escrito debe respetar sus CFLAGS variable y anexar a la misma, sin necesidad de modificar el origen del paquete.

actualización

Suponiendo, entonces, que no se puede volver a definir la variable de CC, ya sea, me gustaría jugar algunos trucos de ruta. Hacer un script de shell en ${HOME}/gcc32 llamada gcc con la siguiente (no probado):

#!/bin/sh 
/usr/bin/gcc -m32 "[email protected]" 

Entonces anteponer esto a su trayectoria cuando se quiere construir 32 bits:

export PATH=${HOME}/gcc32:${PATH} 

modificaciones obvias apoyarán g++, icc, o cualquier otro compilador.

+0

Desafortunadamente, el archivo MAKE establece CFLAGS y, lo que es peor, lo hace en función de una cascada de condiciones. Entonces no puedo factorizar esto fácilmente en mi definición de CFLAGS externa. El escritor de makefile debería haber usado otro nombre de variable y haber dejado CFLAGS para el propósito previsto, pero este es el código tal como es. – Lothar

+0

Incorporado esta nueva información en la actualización anterior – jvasak

+0

Debe utilizar una ruta absoluta, de lo contrario obtendrá una recursión infinita. –

2

Supongamos que gcc y sus amigos se encuentran en "/ usr/bin". Supongamos también que tiene una carpeta llamada "~/.local/bin" que está en su ruta. Puede crear un script bash llamado "gcc" en "~/.local/bin" como:

 
#! /bin/bash 
/usr/bin/gcc -m32 [email protected] 

puede crear de manera similar un "g ++" guión con el contenido de la siguiente manera:

 
#! /bin/bash 
/usr/bin/g++ -m32 [email protected] 

Básicamente, siga haciendo esto para "C++", "cc", "as", "ld", etc. según sea necesario. Haga los guiones ejecutables. Asegúrese de que "~/.local/bin" esté en su variable de entorno PATH ANTES de "/ usr/bin". Si ese es el caso, entonces cuando el archivo MAKE invoca al compilador (suponiendo que usaron rutas relativas), en su lugar se invocarán los scripts.

+1

Use "$ @" (con comillas) para asegurarse de que los espacios en args se manejen correctamente. – coppit

Cuestiones relacionadas