Як встановити 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
Будь-яка причина не використовувати чудовий llvm кланг?
Макс Рід

Не конкретно. Яка користь llvm clang порівняно з gcc ванілі?
quine

3
Незважаючи на те, що він швидший, він також пропонує значущі попередження, але дійсно дорогоцінної функції gcc не вистачає повністю.
Макс Рід

Розумію. Є clang 3.3еквівалент gcc 4.8? Я вірю, що можу і brew installце.
quine

Перше запитання - це повторний кланг, чому ви не можете використовувати кланг, що постачається з 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 / місцеві / бен: / USR / X11 / бен: / USR / місцеві / Go / бен: / USR / texbin
Куайн

Додано ще один варіант
Digitalchild

1
Так, він містить його, але це після / usr / bin, тому він не читається спочатку. PATH є послідовним.
Digitalchild

1
Обидва варіанти, здається, не працюють для мене. Я переїхав /usr/local/binз'являтися 1 - перше в PATH- який не мав ніякого ефекту - виклик gccвсе ще дивиться на gcc 4.2.I потім створені вручну символічні посилання, але коли я відкриваю нове вікно терміналу і 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'

Відповідь Lynken дуже корисна, але я адаптував її псевдонімами, тому що мені простіше скасувати, якщо потрібно.

Зокрема, якщо PATHвстановлено так, що /usr/local/bin(де brew ставить посилання gcc 4.8) з'являється раніше /usr/bin(де gccпосилається за замовчуванням), тоді створення посилань, як запропонував Lyken, /usr/local/binтеоретично має працювати для мене. На практиці це відбувається з якихось причин - якщо помилка з посиланням лінкера і псевдоніми обходять цю помилку, і мені не потрібно вирішувати цю проблему.

Інша перевага псевдонімів полягає в тому, що мені не доведеться посилатися, з яким я хочу працювати з домашньою мовою, і мені не доводиться конкурувати з тим інструментом, для якого версія gcc пов'язана /usr/local


Можливо, вам доведеться змінити це для будь-якого нового бінарного файлу, який ви встановите всередині /usr/local/bin. У вас також можуть бути встановлені та приховані інші бінарні файли через неправильне розташування /usr/local/binвашої PATH. Будь ласка, ще раз розгляньте мою відповідь, це атакує вашу справжню проблему раз, правильно і назавжди.
дан

Правильно. Раніше я згадував Лікен, що переробляв PATHі ставив /usr/local/binперед усіма. Я визнаю, що ваше твердження правильне і що мені потрібно було змінити PATH, але (у моєму випадку - тобто brewвстановлення за замовчуванням gcc 4.8), я все одно не зателефоную gcc 4.8за замовчуванням, коли дзвоню, gccтому що між цими двома за замовчуванням немає симпосилання. Мені довелося створити його вручну, як я це робив вище.
quine

Я б сказала, що її достатньо відрізняється, щоб бути її власною відповіддю, але я б позначив вашу відповідь вирішеною.
Digitalchild

Гаразд - дякую Лікен. Я, як тільки система дозволить мені це зробити.
quine

1
Я також спробував псевдонім, але він працює належним чином, якщо ви запускаєте gccбезпосередньо з терміналу. Якщо ви використовуєте makefile, clangякий все ще використовується, я виявив цю проблему лише під час використання параметра компілятора, доступного лише в gcc.
Tien Do

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/binPATH
quine

Я здивований, brewщо не додав правильних символічних посилань. Ви читали цю відповідь на ту саму тему: apple.stackexchange.com/a/38247/22003 ?
дан

0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.