Вопрос или проблема
Я работаю на OS X 10.7 (Lion). Я установил gcc 4.7 из macports:
sudo port install gcc47
Кажется, оно работает правильно:
$ /opt/local/bin/gcc-mp-4.7 -v
(...)
gcc version 4.7.0 (GCC)
Теперь я пытаюсь изменить компилятор по умолчанию, используя port select:
$ sudo port select gcc mp-gcc47
Выбор 'mp-gcc47' для 'gcc' завершен. 'mp-gcc47' теперь активен.
Это копирует бинарный файл gcc в /opt/local/bin/gcc, который работает правильно:
$ /opt/local/bin/gcc -v
(...)
gcc version 4.7.0 (GCC)
Это также изменяет gcc по умолчанию:
$ which gcc
/opt/local/bin/gcc
Но запуск этого по умолчанию не работает:
$ gcc -v
gcc-mp-4.7: ошибка при попытке выполнить '/opt/local/bin/i686-apple-darwin11-llvm-gcc-4.2': execvp: Нет такого файла или директории
Этот бинарный файл “i686-apple-darwin11-llvm-gcc-4.2” – это оригинальная версия gcc, предоставленная Apple; я не знаю, почему он пытается искать его в /opt/local/bin, или даже почему он пытается запускать его вообще. Если я создам символическую ссылку, он просто вызывает этот бинарный файл, что не то, что я хочу:
$ sudo ln -s /usr/bin/i686-apple-darwin11-llvm-gcc-4.2 /opt/local/bin
$ gcc -v
(...)
gcc version 4.2.1 (основан на сборке Apple Inc. 5658) (LLVM сборка 2335.15.00)
Как это исправить, чтобы gcc работал правильно, просто вызывая “gcc”? Насколько я знаю, в более старых версиях OS X был инструмент gcc_select, но в моей системе его нет.
Скорее всего, это из-за того, что bash имеет закешированный gcc
.
Запустите
$ hash
, чтобы увидеть, какие команды закешированы. Если /usr/bin/gcc появляется в списке, выполните
$ hash gcc
, чтобы обновить хеш gcc
. После этого вы должны увидеть /opt/local/bin/gcc, если выполните hash
, и запуск gcc
должен запускать версию из macports – предоставляя, разумеется, что вы ее выбрали.
/B2S
Редактировать: Для пользователей zsh выполните $ rehash
, чтобы обновить хеш полностью.
У меня такая же проблема, и это не правильное решение – я надеюсь, что кто-то предложит одно. На данный момент вызывайте его напрямую:
$ gcc-mp-4.7 -v
Использование встроенных спецификаций.
COLLECT_GCC=gcc-mp-4.7
COLLECT_LTO_WRAPPER=/opt/local/libexec/gcc/x86_64-apple-darwin11/4.7.0/lto-wrapper
Цель: x86_64-apple-darwin11
Конфигурирован с: ../gcc-4.7.0/configure --prefix=/opt/local --build=x86_64-apple-darwin11 --enable-languages=c,c++,objc,obj-c++,lto,fortran,java --libdir=/opt/local/lib/gcc47 --includedir=/opt/local/include/gcc47 --infodir=/opt/local/share/info --mandir=/opt/local/share/man --datarootdir=/opt/local/share/gcc-4.7 --with-libiconv-prefix=/opt/local --with-local-prefix=/opt/local --with-system-zlib --disable-nls --program-suffix=-mp-4.7 --with-gxx-include-dir=/opt/local/include/gcc47/c++/ --with-gmp=/opt/local --with-mpfr=/opt/local --with-mpc=/opt/local --with-ppl=/opt/local --with-cloog=/opt/local --enable-cloog-backend=isl --enable-stage1-checking --disable-multilib --enable-lto --with-as=/opt/local/bin/as --with-ld=/opt/local/bin/ld --with-ar=/opt/local/bin/ar --with-bugurl=https://trac.macports.org/newticket --with-pkgversion='MacPorts gcc47 4.7.0_3'
Модель потоков: posix
gcc version 4.7.0 (MacPorts gcc47 4.7.0_3)
Надеюсь, это поможет, пока не будет найдено постоянное решение.
Ответ или решение
Ваша проблема с выборами компилятора в MacPorts, связанная с ошибкой при запуске i686-apple-darwin11-llvm-gcc-4.2
, возникает из-за того, что оболочка пытается использовать застарелую версию GCC, установленную Apple по умолчанию. Попробуем рассмотреть решение более детально.
Шаг 1: Убедитесь в корректности установки gcc 4.7
Вы уже выполнили установку GCC версии 4.7 через MacPorts, и он работает исправно. Для этого выполните следующую команду:
/opt/local/bin/gcc-mp-4.7 -v
Если в выводе отображается gcc version 4.7.0
, это говорит о том, что компилятор установлен правильно.
Шаг 2: Проверка выбора компилятора
Вы правильно использовали команду port select
для переключения на версию gcc:
sudo port select --set gcc mp-gcc47
Шаг 3: Освобождение кеша команд (hash)
Проблема может заключаться в том, что оболочка (например, bash или zsh) закэшировала путь к старой версии gcc
. Вы можете проверить закэшированные версии команд, выполнив:
hash
Если в выводе есть путь /usr/bin/gcc
, это означает, что оболочка всё еще ссылается на старую версию. Для сброса кеша и обновления пути выполните:
hash -r
Для пользователей zsh:
rehash
Шаг 4: Проверка результатов
Теперь попробуйте выполнить команду:
gcc -v
Вы должны увидеть вывод, который указывает на вашу установленную версию GCC 4.7.
Возможные дополнения
Если после выполнения всех вышеперечисленных шагов проблема остается, проверьте, не установлены ли в системе какие-либо другие конфликты с именами файлов, такие как символические ссылки на gcc
. Убедитесь, что команда gcc
правильно указывает на /opt/local/bin/gcc
.
Заключение
Приведенные шаги должны помочь вам устранить проблему с вызовом неверной версии компилятора в MacPorts. Также стоит отметить, что всегда полезно обращаться к официальной документации MacPorts и поддержке сообщества для получения более актуальных решений проблем, связанных с настройкой среды разработки на macOS. Если вы все еще столкнулись с трудностями, возможно, стоит проверить наличие обновлений для MacPorts и установить их.