Как установить gcc 4.8 в качестве компилятора gcc по умолчанию


27

Я недавно установил , gcc 4.8используя brewна OSX 10.7.5 (Lion). Теперь я могу скомпилировать с gcc 4.8помощью

g++-4.8 some_file.c

или по умолчанию gcc 4.2с помощью

g++ some_file.c

Я хочу использовать gcc 4.8в качестве компилятора по умолчанию для Xcodeи если я печатаю gccна терминале. Я полагаю, я должен изменить gcc-relatedссылки внутри dirname $(which gcc).

Когда я делаю

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

Я получаю следующее:

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

Когда я бегу: which gcc-4.8я получаю /usr/local/bin/gcc-4.8.

Шаги, чтобы сделать это, были бы очень полезны.

Пожалуйста и спасибо.


1
Любая причина не использовать превосходный лягушка lvm?
Макс Райд

Не специально. В чем преимущество llvm clang по сравнению с vanilla gcc?
Quine

3
Будучи быстрее, он также предлагает значимые предупреждения, но действительно ценной функции gcc не хватает полностью.
Макс Райд

Понимаю. Это clang 3.3эквивалентно gcc 4.8? Я верю, что тоже могу brew install.
Quine

Первый вопрос, который нужно задать: re clang, почему вы не можете использовать clang, поставляемый с Xcode, а не gcc-4.8 - тогда мы могли бы ответить, что clang3.3 будет работать
user151019

Ответы:


20

Предполагая, что вы используете bash (это значение по умолчанию), вы можете добавить / usr / local / bin в качестве основного приоритета в PATH, например:

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

Это обеспечит проверку / usr / local / bin перед всеми другими областями вашего пути. Затем просто запустите новый сеанс терминала, чтобы загрузить новую переменную.

Еще один способ сделать это:

  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++

Мой мыслительный путь уже содержит usr/local/bin. echo $PATHпоказывает: / 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

Добавлена ​​еще одна опция
Digitalchild

1
Да, он есть, но он находится после / usr / bin, поэтому он не читается первым. PATH является последовательным.
Digitalchild

1
Оба варианта, кажется, не работают для меня. Я переместился, /usr/local/binчтобы появиться 1-ым в PATH- который не имел никакого эффекта - вызов gccвсе еще смотрит на. gcc 4.2Я тогда вручную создал символические ссылки, но когда я открываю новое окно терминала и g++или ( cc|c++|gcc), все не найдены. Странный. Спасибо за вашу помощь
Quine

3
Я бы не советовал играть в /usr/binкакой-либо Unix (то есть MacOS X) ... если только вы не специалист, работающий над источниками новой версии следующей версии Unix ☺.
дан

19

Спасибо вам всем за вашу помощь. В итоге я создал псевдонимы ~/.bash_profileследующим образом:

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

Ответ от Линкен очень полезен, но я адаптировал его под псевдонимами, так как мне легче отменить при необходимости.

В частности, если PATHустановлено так, что /usr/local/bin(где brew помещает ссылку gcc 4.8) появляется раньше, чем появляется /usr/bin(где gccсвязано по умолчанию), то создание ссылок, как предложил Ликен внутри, /usr/local/binтеоретически должно работать для меня. На практике это не так по какой-то причине - ошибка с компоновщиком и псевдонимы обходят эту ошибку, и мне тоже не нужно решать эту проблему.

Другое преимущество псевдонимов заключается в том, что мне не нужно связывать то, с чем я хочу, чтобы справился homebrew, и не нужно конкурировать с тем инструментом, для которого версия gcc связана в /usr/local


Возможно, вам придется изменить это для любого нового двоичного файла, который вы будете устанавливать внутри /usr/local/bin. У вас также могут быть установлены и скрыты другие двоичные файлы из-за неправильного позиционирования /usr/local/binв вашем PATH. Пожалуйста, рассмотрите еще раз мой ответ, он нападает на вашу реальную проблему один раз, правильно и навсегда.
дан

Правильно. Я упоминал ранее Lyken, что я изменил PATHи поставил /usr/local/binперед всем. Я признаю, что ваше утверждение верно и что мне нужно было изменить PATH, но (в моем случае - т.е. при brewустановке по умолчанию gcc 4.8) я по-прежнему не буду звонить gcc 4.8по умолчанию при вызове, gccпотому что по умолчанию нет символической ссылки между ними. Мне пришлось вручную создать его, как я делал выше.
Quine

Я бы сказал, что он достаточно отличается, чтобы быть его собственным ответом, но я бы пометил ваш ответ как решенный.
Digitalchild

Хорошо, спасибо Ликен. Я сделаю это, как только система позволит мне сделать это.
Quine

1
Я тоже пробовал псевдоним, но он работает правильно только если вы запускаете gccпрямо из терминала. Если вы используете make-файл, clangон все еще используется, я обнаружил эту проблему только при использовании опции компилятора, доступной только в gcc.
Тиен До

11

Я использую для 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

и вернемся к яблочному 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

или поместите это в файл и затем: source <file>


1

Давайте предположим, что ваша фактическая инициализация оболочки выполнена ~/.profile, и вам придется изменить ее так, чтобы она /usr/local/binопередила любой другой компонент PATH, где gccнаходятся все связанные с ним двоичные файлы.

Вот способ выполнить эту чистую модификацию:

CD

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

if ["$ {_ shell_init}" = ""]; тогда
    # PATH не определен в .profile
    # установить там первое относительное определение PATH
    echo 'PATH = / usr / local / bin: $ {PATH}
экспортировать PATH '>>. профиль
    , .профиль
    exec $ {SHELL}
еще
    # удалить все вхождения / usr / local / bin, где бы они ни находились
    # установить в PATH и вставить его перед всеми другими компонентами
    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
    , .профиль
    exec $ {SHELL}
фи

Осторожно: если ваш ~/.profileуже структурирован, этот сценарий оболочки нужно будет настроить вручную, чтобы он соответствовал правильному определению PATH в нужном месте.


Это, безусловно, идеально подходит для модификации, PATHчтобы /usr/local/binувидеть первым. Это, вероятно, избавит меня от головной боли в будущем. Я хотел бы +1 тебе. Моя проблема, тем не менее, заключается в том, что gccвсе еще связано с, gcc 4.2а не gcc 4.8потому, что нет никакой ссылки для gcc -> gcc-4.8в /usr/local/bin. Мне по-прежнему нужно либо псевдоним gccкак gcc-4.8внутри ~/.profileили symlink ( ln -s gcc-4.8 gcc) в /usr/local/binпосле обновления PATHс вашим сценарием. Вы?
Quine

Я удивлен brew, не добавил правильные символические ссылки. Вы читали этот ответ на ту же тему: apple.stackexchange.com/a/38247/22003 ?
дан

0

Предполагается, что создание псевдонима или связывание с различными двоичными файлами gcc заставит их использовать свое собственное включение перед папкой включения системы по умолчанию.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.