Cómo configurar gcc 4.8 como compilador gcc predeterminado

Recientemente instalé gcc 4.8usando brewen OSX 10.7.5 (Lion). Ahora puedo compilar usando gcc 4.8usando

g++-4.8 some_file.c

o usando el valor predeterminado gcc 4.2usando

g++ some_file.c

Quiero usar gcc 4.8como compilador predeterminado para Xcodey si escribo gccen la terminal. Supongo que debo modificar los gcc-relatedenlaces dentro de dirname $(which gcc).

Cuando lo hago

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

me sale 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 corro: which gcc-4.8obtengo /usr/local/bin/gcc-4.8.

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

Por favor y gracias.

Respuestas (5)

Suponiendo que está usando bash (es el valor predeterminado), puede agregar /usr/local/bin como su principal prioridad en PATH de esta manera:

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

Esto asegurará que /usr/local/bin esté marcado antes que todas las demás áreas de su ruta. Luego simplemente inicie una nueva sesión de terminal para cargar la nueva variable.

Otra forma de hacer esto:

  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++
Para los usuarios de Mac os Catalina o superior, si desea reemplazar los enlaces simbólicos, debe realizar estos pasos antes de reemplazarlos, y también deberá hacer sudo rm -rfno solo rmy sudo lnno simplementeln
Finalmente lograr hacer eso. También tuve que ejecutar csrutil disableen modo Reiniciar en Mac.

Gracias a todos por su ayuda. Terminé simplemente creando alias dentro ~/.bash_profilede 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í deshacer si es necesario.

Específicamente, si PATHestá configurado de tal manera que /usr/local/bin(donde brew coloca el enlace gcc 4.8) aparece antes de que aparezca /usr/bin(donde gccestá vinculado de forma predeterminada), entonces la creación de enlaces como Lyken sugirió en /usr/local/binteoría debería funcionar para mí. En la práctica, no es así por alguna razón: fallar con un error de vinculación y los alias solucionan ese error sin que yo necesite resolver ese problema también.

El otro beneficio de los alias es que no tengo que vincular lo que quiero que homebrew maneje y no tengo que competir con esa herramienta para la que está vinculada la versión de gcc/usr/local

Yo uso 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 de vuelta a apple gcc:

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 el archivo y luego:source <file>

Esto ya no funciona. Tenemos que añadir la versión al final.

Supongamos que su inicialización de shell real se realiza a través ~/.profilede , luego tendrá que modificarlo para colocarlo /usr/local/binpor delante de cualquier otro componente PATH donde se encuentren gcctodos sus binarios asociados.

Esta es la forma de realizar esta modificación limpia:

discos compactos

_shell_init=`egrep '(^| )RUTA' .perfil 2>/dev/null`

si [ "${_shell_init}" = "" ] ; después
    # PATH no está definido en .profile
    # instalar allí la primera definición relativa de PATH
    echo 'RUTA=/usr/local/bin:${RUTA}
exportar RUTA' >>.perfil
    . .perfil
    ejecutivo ${SHELL}
más
    # eliminar todas las apariciones de /usr/local/bin donde sea que estén
    # establezca en PATH e insértelo antes de todos los demás componentes
    sed -E -e '/(^| )PATH=/s,:/usr/local/bin,,' \
        -e '/(^| )RUTA=/s,/usr/local/bin:,,' \
        -e '/(^| )RUTA=/s,,&/usr/local/bin:,' .perfil >.perfil.nuevo
    mv .perfil.nuevo .perfil
    . .perfil
    ejecutivo ${SHELL}
fi

Cuidado: si ~/.profileya está estructurado, este script de shell deberá ajustarse manualmente para que se ajuste a la definición de PATH correcta en el lugar correcto.

Esto sin duda es perfecto para modificar de PATHmodo que /usr/local/binse vea primero. Esto probablemente me ahorrará dolores de cabeza en el futuro. Ojalá pudiera hacer +1 en ti. Sin embargo, mi problema es que gcctodavía está vinculado gcc 4.2y no gcc 4.8porque no haya un enlace simbólico gcc -> gcc-4.8para /usr/local/bin. Todavía necesitaría un alias gcccomo gcc-4.8dentro ~/.profileo un enlace simbólico ( ln -s gcc-4.8 gcc) /usr/local/bindespués de actualizar PATHcon su secuencia de comandos. ¿S.M?
Me sorprende brewque no haya agregado los enlaces simbólicos correctos. ¿Leíste esta respuesta sobre el mismo tema: apple.stackexchange.com/a/38247/22003 ?

Se supone que la creación de alias o la vinculación a diferentes archivos binarios de gcc hará que utilicen su propia carpeta de inclusión antes de la carpeta de inclusión predeterminada del sistema.