¿Cómo cambiar el compilador GCC predeterminado en Ubuntu?

95

He instalado gcc-3.3 / g ++ - 3.3 en ubuntu 11.04 que ya tiene gcc / g ++ - 4.4. Entonces, en mi sistema, tanto gcc-3.3 como 4.4 están disponibles. Puedo llamar a ambos compiladores como quiera. Si llamo al comando, gccse llamará a gcc-4.4. Para llamar a gcc-3.3, tengo que usar el comando gcc-3.3.

¿Cómo puedo cambiar el compilador predeterminado a gcc-3.3? Cuando ejecuto el comando gcc, debería llamar a gcc-3.3 y no a gcc-4.4.

Además, ¿cómo puedo cambiar la variable CXX en un archivo make a gcc-3.3? Deseo cambiar un lugar global común en el sistema en lugar de cambiar todos los archivos make.

RoboAlex
fuente
2
Para el indicador CXX, puede invocar CXX=gcc-3.3o export CXX=gcc-3.3y luego, makesin embargo, cuando lo cambió globalmente update-alternatives, ya usará gcc-3.3 y esto no es necesario.
DipSwitch
1
@RoboAlex: actualicé mi respuesta nuevamente para tener en cuenta su solicitud de variable de entorno CXX. Sin embargo, tenga en cuenta que solo servirá en caso de que modifique las alternativas de actualización más adelante.
jopasserat
Solo necesita cambiar su PATH. La mayoría de las respuestas mencionan el sistema de alternativas, pero tanto los mantenedores de Debian como los de LLVM están de acuerdo en que el sistema de alternativas debe usarse para alternativas , NO para versiones . Explicado con más detalle en mi respuesta.
hmijail llora a los resignatarios el

Respuestas:

112

Como sugirió @Tommy, debes usar update-alternatives.
Asigna valores a cada software de una familia, de modo que define el orden en el que se llamarán las aplicaciones.

Se utiliza para mantener diferentes versiones del mismo software en un sistema. En su caso, podrá utilizar varias declinaciones de gcc, y una será favorecida.

Para averiguar las prioridades actuales de gcc, escriba el comando señalado por el comentario de @ tripleee:

update-alternatives --query gcc

Ahora, tenga en cuenta la prioridad atribuida a gcc-4.4porque tendrá que dar una mayor a gcc-3.3.
Para establecer sus alternativas, debe tener algo como esto (asumiendo que su gccinstalación está ubicada en /usr/bin/gcc-3.3, y gcc-4.4la prioridad es menor que 50) :

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-3.3 50

--editar--

Por último, también puede utilizar la interfaz interactiva de update-alternativespara cambiar fácilmente entre versiones. Escriba update-alternatives --config gccpara que se le pida que elija la versión de gcc que desea usar entre las instaladas.

--editar 2 -

Ahora, para corregir la variable de entorno CXX en todo el sistema, debe colocar la línea indicada por @ DipSwitch en su .bashrcarchivo (esto aplicará el cambio solo para su usuario, que es más seguro en mi opinión):

echo 'export CXX=/usr/bin/gcc-3.3' >> ~/.bashrc
jopasserat
fuente
1
@thang también llamado cc:root@host:/root# update-alternatives --get-selections | grep '/usr/bin/gcc' cc auto /usr/bin/gcc
jopasserat
Cuando ejecuto las 'alternativas de actualización --config gcc', no pasa nada, a pesar de que tengo el sistema gcc y anaconda uno
Kelthar
¿Cómo pudiste hacer esto automáticamente? esto requiere un paso manual para verificar la salida update-alternatives --query gcc, que podría no funcionar, por ejemplo, en un script de aprovisionamiento automático. Además, ¿cómo se puede hacer que esto sea independiente de la plataforma?
ely
68

Aquí hay un ejemplo completo de la respuesta de jHackTheRipper para la multitud de TL; DR. :-) En este caso, quería ejecutar g ++ - 4.5 en un sistema Ubuntu que por defecto es 4.6. Como root:

apt-get install g++-4.5
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6 100
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.5 50
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 100
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.5 50
update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-4.6 100
update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-4.5 50
update-alternatives --set g++ /usr/bin/g++-4.5
update-alternatives --set gcc /usr/bin/gcc-4.5
update-alternatives --set cpp-bin /usr/bin/cpp-4.5

Aquí, 4.6 sigue siendo el predeterminado (también conocido como "modo automático"), pero cambio explícitamente a 4.5 temporalmente (modo manual). Para volver a 4.6:

update-alternatives --auto g++
update-alternatives --auto gcc
update-alternatives --auto cpp-bin

(Tenga en cuenta el uso de en cpp-binlugar de solo cpp. Ubuntu ya tiene una cppalternativa con un enlace maestro de /lib/cpp. Cambiar el nombre de ese enlace eliminaría el /lib/cppenlace, lo que podría romper los scripts).

Trevor Robinson
fuente
8
Para la persona perezosa del futuro que intente configurar el compilador g ++ - 5 instalado como predeterminado:sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 100
imallett
Solo queda una pregunta: ¿por qué APT no hace esto al instalar el g++-6paquete?
rustyx
Cambié el compilador predeterminado a g ++ - 5 de esta manera, pero todavía usa bibliotecas estándar g ++ - 7, y ahora recibo errores con __builtincosas no definidas .
Youda008
22

Esta es la gran descripción e instrucción paso a paso sobre cómo crear y administrar alternativas de maestro y esclavo (gcc y g ++).

En breve es:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.6
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7
sudo update-alternatives --config gcc
Anton K
fuente
qué pasa con los 40 y 60. Estoy tratando de usar gcc-6.
nyxee
@nyxee 40 y 60 denotan la prioridad asignada a cada entrada, verifique las otras respuestas para obtener más información sobre el tema
jopasserat
10

Entre 4.8 y 6 con todo --slaves:

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 \
                    10 \
                    --slave   /usr/bin/cc cc /usr/bin/gcc-4.8 \
                    --slave   /usr/bin/c++ c++ /usr/bin/g++-4.8 \
                    --slave   /usr/bin/g++ g++ /usr/bin/g++-4.8 \
                    --slave   /usr/bin/gcov gcov /usr/bin/gcov-4.8 \
                    --slave   /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-4.8 \
                    --slave   /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-4.8 \
                    --slave   /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-4.8 \
                    --slave   /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-4.8 \
                    --slave   /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-4.8

y

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 \
                    15 \
                    --slave   /usr/bin/cc cc /usr/bin/gcc-6 \
                    --slave   /usr/bin/c++ c++ /usr/bin/g++-6 \
                    --slave   /usr/bin/g++ g++ /usr/bin/g++-6 \
                    --slave   /usr/bin/gcov gcov /usr/bin/gcov-6 \
                    --slave   /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-6 \
                    --slave   /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-6 \
                    --slave   /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-6 \
                    --slave   /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-6 \
                    --slave   /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-6

Cambie entre ellos con update-alternatives --config gcc.

szotsaki'gofundme-DefendFromSO
fuente
2
funciona bien después de eliminar las líneas ccy c++, lo que causa un error: la alternativa cc no puede ser esclava de gcc: es una alternativa maestra
palik
7

Ahora, hay gcc-4.9 disponible para Ubuntu / exact.

Cree un grupo de alternativas de compilador donde el compilador de distribución tenga una prioridad más alta:

root$ VER=4.6 ; PRIO=60
root$ update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
root$ update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-$VER $PRIO

root$ VER=4.9 ; PRIO=40
root$ update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
root$ update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-$VER $PRIO

NOTA: la versión de g ++ se cambia automáticamente con un cambio de versión de gcc. cpp-bin debe realizarse por separado ya que existe una alternativa maestra "cpp".

Enumere las alternativas de compilador disponibles:

root$ update-alternatives --list gcc
root$ update-alternatives --list cpp-bin

Para seleccionar manualmente la versión 4.9 de gcc, g ++ y cpp, haga:

root$ update-alternatives --config gcc
root$ update-alternatives --config cpp-bin

Verifique las versiones del compilador:

root$ for i in gcc g++ cpp ; do $i --version ; done

Restaurar la configuración del compilador de distribución (aquí: de vuelta a v4.6):

root$ update-alternatives --auto gcc
root$ update-alternatives --auto cpp-bin
dileks
fuente
2

Encontré este problema al intentar instalar un nuevo compilador de clang. Resulta que tanto los mantenedores de Debian como los de LLVM están de acuerdo en que el sistema de alternativas debe usarse para alternativas, NO para versiones .

La solución que proponen es algo como esto:
PATH=/usr/lib/llvm-3.7/bin:$PATH
donde /usr/lib/llvm-3.7/bin es un directorio que fue creado por el paquete llvm-3.7, y que contiene todas las herramientas con sus nombres sin sufijo. Con eso, llvm-config (versión 3.7) aparece con su nombre simple en su RUTA. No hay necesidad de perder el tiempo con los enlaces simbólicos, ni de llamar al llvm-config-3.7 que se instaló en / usr / bin.

Además, busque un paquete llamado llvm-defaults (o gcc-defaults), que podría ofrecer otra forma de hacer esto (no lo usé).

hmijail llora a los resignatarios
fuente
Excelente solucion! Lo uso para seleccionar entre suites "gcc" personalizadas
Mad Calm
1

En caso de que desee una forma más rápida (pero aún muy limpia) de lograrlo para un propósito personal (por ejemplo, si desea construir un proyecto específico que tenga algunos requisitos estrictos con respecto a la versión del compilador), simplemente siga los siguientes pasos:

  • escriba echo $PATHy busque un directorio personal que tenga una prioridad muy alta (en mi caso, lo tengo ~/.local/bin);
  • agregue los enlaces simbólicos en este directorio:

Por ejemplo:

ln -s /usr/bin/gcc-WHATEVER ~/.local/bin/gcc
ln -s /usr/bin/g++-WHATEVER ~/.local/bin/g++

Por supuesto, esto funcionará para un solo usuario (no es una solución para todo el sistema), pero por otro lado no me gusta cambiar demasiadas cosas en mi instalación.

Thomas Baruchel
fuente
Por lo tanto, está creando su propio sistema de alternativas ad-hoc y paralelo al sistema. ¿Por qué no usar el real?
hmijail llora a los resignatarios el
@hmijail Como expliqué, uso esta forma cuando quiero construir un solo proyecto sin estropear toda mi instalación. Funciona muy bien y puedo quitarlo fácilmente después.
Thomas Baruchel
1
Simplemente cambiar su PATH sería más rápido, más limpio y mantendría sus herramientas relacionadas con gcc sincronizadas entre sí.
hmijail llora a los resignatarios el
0

Usé solo las líneas de abajo y funcionó. Sólo quería recopilar VirtualBoxy VMWare WorkStationutilizar kernel 4.8.10el Ubuntu 14.04. Inicialmente, la mayoría de las cosas no funcionaban, por ejemplo, los gráficos y las redes. Tuve suerte de que lo VMWare workstationsolicitara gcc 6.2.0. No pude iniciar mi Genymotion Android emulatorsporque virtualbox estaba caído. Publicará los resultados más tarde si es necesario.

VER=4.6 ; PRIO=60
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
VER=6 ; PRIO=50
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
VER=4.8 ; PRIO=40
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
nyxee
fuente