Arm1.ru

Проблемы компиляции C++-приложений у Homebrew в OS X 10.9 Mavericks

Есть проблема с Homebrew в OS X 10.9 Mavericks - некоторые пакеты не компилятся из исходных кодов. Касается это программ, написанных на C++. Вчера пришлось потратить некоторое количество времени на её решение.

Судя по гуглению, проблема касается только тех, кто обновлялся в 10.8 на 10.9. У тех, кто ставил систему с нуля - вроде бы всё хорошо.

Вчера получил вот такое:

 $ brew update
Updated Homebrew from f949b212 to 9d10c43e.
==> Updated Formulae
gfortran
$ brew install spidermonkey
==> Downloading http://ftp.mozilla.org/pub/mozilla.org/js/js185-1.0.0.tar.gz
Already downloaded: /Library/Caches/Homebrew/spidermonkey-1.8.5.tar.gz
==> ../js/src/configure --prefix=/usr/local/Cellar/spidermonkey/1.8.5 --enable-readline --enable-threadsafe --with-system-nspr --enable-macos-target=10.9
==> make
==> make install
Error: spidermonkey dependency readline was built with the following
C++ standard library: libstdc++ (from clang)

This is incompatible with the standard library being used
to build spidermonkey: libc++ (from clang)

Please reinstall readline using a compatible compiler.
hint: Check https://github.com/mxcl/homebrew/wiki/C++-Standard-Libraries

Погуглив и потыкавшись в issues на github'е, пошёл по ссылке, которая в консоли была в последней строчке. Там было:


Есть две стандартные C++ библиотеки, которые поддерживают компиляторы Apple.

По умолчанию в 10.8 и более ранних использовалась libstdc++, она поддерживалась компиляторами Apple GCC, GNU GCC и clang.

В 10.9 по умолчанию используется libc++, она же по умолчанию в clang на более старых платформах при билдинге кода C++11.

Существуют некоторые несовместимости между несколькими стандартными C++ библиотеками, поэтому Homebrew отбраковывает установку софта если его зависимость была собрана с несовместимой C++ библиотекой. Он рекомендует вам собирать дерево зависимостей используя совместимый компилятор.

Если вы обновились до 10.9 с более ранней версии - потому, что по умолчанию теперь как C++ библиотека используется libc++, возможно вы не сможете собрать из исходных кодов программы, чьи зависимости были собраны в 10.8 или более ранних. Если вы читаете это потому, что были направлены сюда ошибкой компиляции, вы можете исправить всё переустановив зависимости пакета, который вы пытаетесь собрать.

Вот, собственно, и решение проблемы. Если вы ставите какой-то пакет (в данном случае spidermonkey) и видите ошибку вроде:

Error: spidermonkey dependency readline was built with the following
C++ standard library: libstdc++ (from clang)

то нужно просто переустановить зависимость, на которую ругается компилятор. В данном случае readline. Просто выполнив команду:

brew reinstall -v readline

После того, как зависимость будет пересобрана - сам пакет установится.

Собственно, я с этим столкнулся, когда пытался установить новую версию CouchDB. Она тянет за собой spidermonkey, которая тянет за собой readline. Обе зависимости пришлось просто переустановить.

Надеюсь, заметка кому-нибудь сэкономит время.

keyboard_return back