35 votos

¿Cómo configurar gcc 4.8 como compilador gcc predeterminado?

Recientemente instalé gcc 4.8 utilizando brew en OSX 10.7.5 (Lion). Ahora puedo compilar usando gcc 4.8 utilizando

g++-4.8 some_file.c

o usando el gcc 4.2 por defecto utilizando

g++ some_file.c

Quiero utilizar gcc 4.8 como el compilador predeterminado para Xcode y al escribir gcc en la terminal. Supongo que debo cambiar los enlaces relacionados con gcc en el directorio dirname $(which gcc).

Cuando ejecuto

ls -al $(dirname $(which gcc)) | grep 'gcc\|g++\|c++'

Obtengo lo siguiente:

lrwxr-xr-x     1 root   wheel         7 Jul 31 12:17 c++ -> clang++
-rwxr-xr-x     1 root   wheel    909360 Nov 18  2011 c++filt
lrwxr-xr-x     1 root   wheel         5 Jul 31 12:17 clang++ -> clang
lrwxr-xr-x     1 root   wheel        12 Jul 31 12:17 g++ -> llvm-g++-4.2
lrwxr-xr-x     1 root   wheel        12 Jul 31 12:17 gcc -> llvm-gcc-4.2
lrwxr-xr-x     1 root   wheel        28 Jul 31 12:17 gcov-4.2 -> ../llvm-gcc-4.2/bin/gcov-4.2
lrwxr-xr-x     1 root   wheel        52 Jul 31 12:17 i686-apple-darwin11-llvm-g++-4.2 -> ../llvm-gcc-4.2/bin/i686-apple-darwin11-llvm-g++-4.2
lrwxr-xr-x     1 root   wheel        52 Jul 31 12:17 i686-apple-darwin11-llvm-gcc-4.2 -> ../llvm-gcc-4.2/bin/i686-apple-darwin11-llvm-gcc-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-cpp-4.2 -> ../llvm-gcc-4.2/bin/llvm-cpp-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-g++ -> ../llvm-gcc-4.2/bin/llvm-g++-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-g++-4.2 -> ../llvm-gcc-4.2/bin/llvm-g++-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-gcc -> ../llvm-gcc-4.2/bin/llvm-gcc-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-gcc-4.2 -> ../llvm-gcc-4.2/bin/llvm-gcc-4.2

Cuando ejecuto: which gcc-4.8 obtengo /usr/local/bin/gcc-4.8.

Los pasos para lograr esto serían muy útiles.

Por favor y gracias.

25voto

David Anderson Puntos 91

Suponiendo que estás utilizando bash (es el valor predeterminado), entonces puedes agregar /usr/local/bin como tu prioridad principal en PATH de esta manera:

echo "PATH=\"/usr/local/bin:$PATH\"" >> ~/.bash_profile

Esto asegurará que /usr/local/bin se verifique antes que todas las demás áreas de tu ruta. Luego simplemente inicia una nueva sesión de terminal para cargar la nueva variable.

Otra forma de hacerlo:

  cd /usr/bin
  rm cc gcc c++ g++
  ln -s /usr/local/bin/gcc-4.8 cc
  ln -s /usr/local/bin/gcc-4.8 gcc
  ln -s /usr/local/bin/c++-4.8 c++
  ln -s /usr/local/bin/g++-4.8 g++

1 votos

Para usuarios en Mac OS Catalina o superior, si desea reemplazar los enlaces simbólicos, necesitará seguir estos pasos antes de reemplazarlos, y también necesitará hacer sudo rm -rf no solo rm y sudo ln no simplemente ln

0 votos

Finalmente logré hacer eso. También tuve que ejecutar csrutil disable en modo de reinicio en Mac.

24voto

quine Puntos 145

Gracias a todos por su ayuda. Terminé creando alias dentro de ~/.bash_profile de la siguiente manera:

alias gcc='gcc-4.8'
alias cc='gcc-4.8'
alias g++='g++-4.8'
alias c++='c++-4.8'

La respuesta de Lynken es muy útil, pero la adapté con alias ya que es más fácil para mí deshacerlo si es necesario.

Específicamente, si PATH está configurado de tal manera que /usr/local/bin (donde brew coloca el enlace a gcc 4.8) aparece antes de /usr/bin (donde gcc está enlazado por defecto), entonces crear enlaces como sugirió Lyken dentro de /usr/local/bin teóricamente debería funcionar para mí. En la práctica, no funciona por alguna razón, fallando con un error de enlaceador y los alias solucionan ese error sin necesidad de que yo resuelva ese problema, también.

Otro beneficio de los alias es que no tengo que enlazar lo que quiero que homebrew maneje y no tener que competir con esa herramienta por la versión de gcc enlazada en /usr/local

15voto

ydk2 Puntos 59

Yo solía usar gcc-4.8:

export CC=/usr/local/bin/gcc

export CXX=/usr/local/bin/g++

export CPP=/usr/local/bin/cpp

export LD=/usr/local/bin/gcc

alias c++=/usr/local/bin/c++

alias g++=/usr/local/bin/g++

alias gcc=/usr/local/bin/gcc

alias cpp=/usr/local/bin/cpp

alias ld=/usr/local/bin/gcc

alias cc=/usr/local/bin/gcc

y luego volver al gcc de apple:

export CC=/usr/bin/gcc

export CXX=/usr/bin/g++

export CPP=/usr/bin/cpp

export LD=/usr/bin/ld

alias c++=/usr/bin/c++

alias g++=/usr/bin/g++

alias gcc=/usr/bin/gcc

alias cpp=/usr/bin/cpp

alias cc=/usr/bin/gcc

alias ld=/usr/bin/ld

o ponerlo en un archivo y luego: source

0 votos

Esto ya no funciona. Debemos agregar la versión al final.

2voto

Rich Puntos 2429

Supongamos que tu inicialización de shell actual se realiza a través de ~/.profile, entonces tendrás que modificarlo para colocar /usr/local/bin antes que cualquier otro componente PATH donde se encuentren gcc y todos sus binarios asociados.

Así es como se realiza esta modificación limpia:

cd

\_shell\_init=\`egrep '(^| )PATH' .profile 2>/dev/null\`

if \[ "${\_shell\_init}" = "" \] ; then
    # PATH no está definido en .profile
    # instala allí la primera definición relativa de PATH
    echo 'PATH=/usr/local/bin:${PATH}
export PATH' >>.profile
    . .profile
    exec ${SHELL}
else
    # elimina todas las ocurrencias de /usr/local/bin donde sea que estén 
    # establecidas en PATH, e insértalo antes de todos los demás componentes
    sed -E -e '/(^| )PATH=/s,:/usr/local/bin,,' \\
        -e '/(^| )PATH=/s,/usr/local/bin:,,' \\
        -e '/(^| )PATH=/s,,&/usr/local/bin:,' .profile >.profile.new
    mv .profile.new .profile
    . .profile
    exec ${SHELL}
fi

Advertencia: si tu ~/.profile ya está estructurado, este script de shell tendrá que ser ajustado manualmente para que la definición de PATH sea correcta en el lugar adecuado.

0 votos

Esto es sin duda perfecto para modificar PATH de modo que /usr/local/bin se vea primero. Esto probablemente me ahorrará dolores de cabeza en el futuro. Ojalá pudiera darte un +1. Mi problema es que gcc sigue enlazado a gcc 4.2 y no a gcc 4.8 porque no hay un enlace simbólico para gcc -> gcc-4.8 en /usr/local/bin. Todavía tendría que alias gcc como gcc-4.8 dentro de ~/.profile o crear un enlace simbólico (ln -s gcc-4.8 gcc) en /usr/local/bin después de actualizar PATH con tu script. ¿Sí?

0 votos

Me sorprende que brew no haya añadido los enlaces simbólicos correctos. ¿Leíste esta respuesta sobre el mismo tema: apple.stackexchange.com/a/38247/22003?

0voto

Dragonborn Puntos 101

Se asume que la creación de alias o enlaces a diferentes binarios de gcc hará que usen su propia carpeta de inclusión antes de la carpeta de inclusión del sistema por defecto.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X