Cómo configurar gcc 4.8 como compilador gcc predeterminado

27

Recientemente he instalado gcc 4.8usando brewel OSX 10.7.5 (Lion). Ahora puedo compilar gcc 4.8usando

g++-4.8 some_file.c

o usando el 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 alterar los gcc-relatedenlaces dentro 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.8me sale /usr/local/bin/gcc-4.8.

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

Por favor y gracias.

quine
fuente
1
¿Alguna razón para no usar el sonido superior de llvm?
Max Ried
No específicamente. ¿Cuál es el beneficio de llvm clang en comparación con vanilla gcc?
quine
3
Si bien es más rápido, también ofrece advertencias significativas, una característica realmente preciosa que carece por completo de gcc.
Max Ried
Veo. ¿Es clang 3.3el equivalente a gcc 4.8? Creo que puedo brew installhacerlo también.
quine
La primera pregunta es relang por qué no puede usar el clang suministrado con Xcode en lugar de gcc-4.8, entonces podríamos responder que clang3.3 funcionaría
user151019

Respuestas:

20

Suponiendo que está utilizando 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++
Digitalchild
fuente
Mi camino de pensar ya contiene usr/local/bin. echo $PATHrevela: / opt / local / bin: / opt / local / sbin: / opt / local / include: / usr / local / mysql / bin: / usr / bin / bjam: / usr / bin: / bin: / usr / sbin: / sbin: / usr / local / bin: / usr / X11 / bin: / usr / local / go / bin: / usr / texbin
quine
Se agregó otra opción
Digitalchild
1
Sí, lo contiene pero está después de / usr / bin para que no se lea primero. RUTA es secuencial.
Digitalchild
1
Ambas opciones parecen no funcionar para mí. Me moví /usr/local/binpara aparecer en primer lugar PATH, lo que no tuvo ningún efecto, la llamada gcctodavía se ve gcc 4.2. Luego, creé manualmente los enlaces simbólicos, pero cuando abro una nueva ventana de terminal y g++(o cc|c++|gcc) no se encuentran todos. Extraño. Gracias por su ayuda
quine
3
No recomendaría jugar dentro /usr/binde cualquier Unix (que es MacOS X) ... a menos que sea un especialista trabajando en las fuentes de una nueva versión de la próxima versión de Unix ☺.
dan
19

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

Específicamente, si PATHse configura de manera tal que /usr/local/bin(donde brew pone 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 lo hace por alguna razón: fallar con un error de enlazador y los alias evitan ese error sin que yo también necesite resolver ese problema.

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

quine
fuente
Puede que tenga que cambiar esto para cualquier binario nuevo que instalará dentro /usr/local/bin. También puede tener otros binarios instalados y ocultos debido al mal posicionamiento de /usr/local/binsu RUTA. Considere una vez más mi respuesta, está atacando su problema real una vez, correctamente y para siempre.
dan
Correcto. Mencioné antes a Lyken que alteré PATHy puse /usr/local/binantes de todo. Admito que su declaración es correcta y que necesitaba modificarla PATH, pero (en mi caso, es decir, la brewinstalación predeterminada de gcc 4.8), aún no llamaré gcc 4.8de manera predeterminada cuando llame gccporque no hay un enlace simbólico entre los dos de manera predeterminada. Tuve que crearlo manualmente como lo hice anteriormente.
quine
Diría que es lo suficientemente diferente como para ser su propia respuesta, aunque marcaría su respuesta como resuelta.
Digitalchild
Ok, gracias Lyken. Lo haré tan pronto como el sistema me lo permita.
quine
1
También probé el alias, pero solo funciona correctamente si se ejecuta gccdirectamente desde la terminal. Si todavía usa un archivo MAKE, clangsolo encontré este problema al usar una opción de compilador que solo está disponible en gcc.
Tien Do
11

Yo uso para 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 póngalo en el archivo y luego: source <file>

ydk2
fuente
1

Supongamos que su inicialización de shell real se realiza ~/.profile, luego tendrá que modificarla para /usr/local/binadelantar a cualquier otro componente PATH donde gccy todos sus binarios asociados estén.

Aquí está la forma de realizar esta modificación limpia:

discos compactos

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

if ["$ {_ shell_init}" = ""]; luego
    # PATH no está definido en .profile
    # instalar allí la primera definición relativa de RUTA
    echo 'RUTA = / usr / local / bin: $ {RUTA}
export PATH '>>. profile
    . .perfil
    exec $ {SHELL}
más
    # eliminar todas las ocurrencias de / usr / local / bin donde sea que estén
    # establecer en RUTA e insertarlo antes que todos los demás componentes
    sed -E -e '/ (^ |) PATH = / s,: / usr / local / bin ,,' \
        -e '/ (^ |) RUTA = / s, / usr / local / bin: ,,' \
        -e '/ (^ |) PATH = / s ,, & / usr / local / bin :,' .profile> .profile.new
    mv .profile.new .profile
    . .perfil
    exec $ {SHELL}
fi

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

dan
fuente
Esto es ciertamente perfecto para modificar, por PATHlo que /usr/local/binse ve primero. Esto probablemente me ahorrará dolores de cabeza en el futuro. Desearía poder 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.8en /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 script. ¿S.M?
quine
Me sorprende brewque no haya agregado los enlaces simbólicos correctos. ¿Leyó esta respuesta sobre el mismo tema: apple.stackexchange.com/a/38247/22003 ?
dan
0

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

Dragonborn
fuente