Como definir o gcc 4.8 como compilador padrão do gcc

27

Eu instalei recentemente gcc 4.8usando brewon OSX 10.7.5 (Lion). Agora posso compilar usando gcc 4.8usando

g++-4.8 some_file.c

ou usando o padrão gcc 4.2usando

g++ some_file.c

Eu quero usar gcc 4.8como o compilador padrão para Xcodee se eu digitar gccno terminal. Suponho que devo alterar os gcc-relatedlinks internos dirname $(which gcc).

Quando eu faço

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

Eu recebo o seguinte:

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

Quando eu corro: which gcc-4.8eu entendo /usr/local/bin/gcc-4.8.

Passos para fazer isso seriam muito úteis.

Por favor e obrigado.

quine
fonte
1
Alguma razão para não usar o llvm clang superior?
precisa
Não especificamente. Qual é o benefício do llvm clang comparado ao vanilla gcc?
Quine
3
Embora seja mais rápido, também oferece avisos significativos, um recurso realmente precioso que o gcc não possui.
precisa saber é o seguinte
Entendo. É clang 3.3o equivalente a gcc 4.8? Eu acredito que posso brew installtambém.
Quine
Primeira pergunta a fazer é clang re porque você não pode usar o clang fornecido com Xcode ao invés de gcc-4.8 - então poderíamos responder de clang3.3 iria trabalhar
user151019

Respostas:

20

Supondo que você esteja usando o bash (é o padrão), você poderá adicionar / usr / local / bin como sua principal prioridade no PATH da seguinte maneira:

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

Isso garantirá que / usr / local / bin seja verificado antes de todas as outras áreas do seu caminho. Em seguida, basta iniciar uma nova sessão do terminal para carregar a nova variável.

Outra maneira de fazer isso:

  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
fonte
Meu caminho do pensamento já contém 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 / Você pode usar o seguinte comando: sbin: / sbin: / usr / local / bin: / usr / X11 / bin: / usr / local / go / bin: / usr / texbin
quine
Adicionada outra opção
Digitalchild
1
Sim, ele contém, mas está em / usr / bin, para que não seja lido primeiro. PATH é seqüencial.
precisa saber é o seguinte
1
Ambas as opções parecem não funcionar para mim. Eu mudei /usr/local/binpara aparecer em primeiro lugar PATH- o que não teve efeito - a chamada gccainda olha gcc 4.2. Eu criei manualmente os links simbólicos, mas quando abro uma nova janela do terminal e g++ou ( cc|c++|gcc) todos não são encontrados. Estranho. Obrigado pela vossa ajuda
Quine
3
Eu não recomendaria jogar dentro /usr/binde qualquer Unix (que é o MacOS X) ... a menos que você seja um especialista trabalhando nas fontes de uma nova versão da próxima versão do Unix ☺.
dan
19

Obrigado a todos pela ajuda. Acabei criando aliases da ~/.bash_profileseguinte maneira:

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

A resposta do Lynken é muito útil, mas eu a adaptei com aliases, pois é mais fácil desfazer isso, se necessário.

Especificamente, se PATHestiver definido de forma que /usr/local/bin(onde o brew coloca o link gcc 4.8) apareça antes de aparecer /usr/bin(onde gccestá vinculado por padrão), a criação de links conforme sugerido por Lyken dentro /usr/local/bindeve, teoricamente, funcionar para mim. Na prática, isso não ocorre por algum motivo - falhar com um erro de vinculador e aliases soluciona esse erro sem que eu precise resolver esse problema também.

O outro benefício dos aliases é que não tenho que vincular o que quero que o homebrew manipule e não tenho que competir com a ferramenta pela qual a versão do gcc está vinculada /usr/local

quine
fonte
Pode ser necessário alterar isso para qualquer novo binário no qual você instalará /usr/local/bin. Você também pode ter outros binários instalados e ocultos devido ao mau posicionamento /usr/local/binno seu PATH. Por favor, considere mais uma vez a minha resposta, está atacando seu problema real uma vez, corretamente e para sempre.
dan
Direita. Mencionei anteriormente a Lyken que alterei PATHe coloquei /usr/local/binantes de tudo. Eu admito que sua declaração está correta e que eu precisava alterar PATH, mas (no meu caso - por exemplo, brewinstalação padrão gcc 4.8) eu ainda não chamarei gcc 4.8por padrão quando eu ligar, gccporque não há vínculo simbólico entre os dois por padrão. Eu tive que criá-lo manualmente, como fiz acima.
Quine
Eu diria que é diferente o suficiente para ser sua própria resposta, mas marcaria sua resposta como resolvida.
precisa saber é o seguinte
Ok - obrigado Lyken. Vou assim que o sistema me permitir fazê-lo.
Quine
1
Eu tentei o alias também, mas ele só funciona corretamente se você executar gccdiretamente do terminal. Se você usa um makefile, clangainda é usado, encontrei esse problema apenas ao usar uma opção de compilador disponível apenas em gcc.
Tien Do
11

Eu uso o 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

e de volta ao 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

ou coloque-o no arquivo e depois: source <file>

ydk2
fonte
1

Vamos supor que a inicialização real do shell seja feita ~/.profile, então você terá que modificá-lo para colocar /usr/local/binà frente de qualquer outro componente PATH onde gcce todos os seus binários associados.

Aqui está a maneira de executar esta modificação limpa:

CD

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

if ["$ {_ shell_init}" = ""]; então
    # PATH não está definido em .profile
    # instale lá a primeira definição relativa de PATH
    echo 'PATH = / usr / local / bin: $ {PATH}
exportar PATH '>>. profile
    . .perfil
    exec $ {SHELL}
outro
    # remova todas as ocorrências de / usr / local / bin onde quer que estejam
    # definido no PATH e insira-o antes de todos os outros componentes
    sed -E -e '/ (^ |) CAMINHO = / s,: / usr / local / bin ,,' \
        -e '/ (^ |) PATH = / s, / usr / local / bin: ,,' \
        -e '/ (^ |) PATH = / s ,, & / usr / local / bin :,' .profile> .profile.new
    mv .profile.new .profile
    . .perfil
    exec $ {SHELL}
fi

Cuidado: se o seu ~/.profilejá estiver estruturado, esse script de shell precisará ser ajustado manualmente para ajustar a definição PATH correta no lugar certo.

dan
fonte
Isso certamente é perfeito para modificar, PATHpara que /usr/local/binseja visto primeiro. Isso provavelmente me salvará dores de cabeça no futuro. Eu gostaria de poder marcar você com +1. Meu problema é que embora gccainda está ligado ao gcc 4.2e não gcc 4.8porque não há nenhuma ligação simbólica para gcc -> gcc-4.8nos /usr/local/bin. Eu ainda precisaria usar o alias gcccomo gcc-4.8dentro ~/.profileou o link simbólico ( ln -s gcc-4.8 gcc) /usr/local/bindepois de atualizar PATHcom seu script. Vós?
Quine
Estou surpreso brewpor não adicionar os links simbólicos corretos. Você leu esta resposta sobre o mesmo assunto: apple.stackexchange.com/a/38247/22003 ?
dan
0

Supõe-se que o alias de criação ou o link para binários diferentes do gcc os façam usar sua própria inclusão antes da pasta de inclusão do sistema padrão.

Dragonborn
fonte