Как мне получить поддержку С++ 0x/С++ 11 для развертывания Mac OS X 10.6 с использованием Xcode 4.6.2 через 7.1.1

Я сильно использую функции С++ 0x/С++ 11 в своем проекте, в частности, блоки кода и общие указатели. Когда я обновил свою ОС до 10.8 Mountain Lion (Edit: From 10.7), я был вынужден обновить Xcode. При обновлении Xcode я потерял способность скомпилировать мой проект С++ для развертывания на 10.6 системах, поскольку получаю следующую ошибку.

clang: error: invalid deployment target for -stdlib=libc++ (requires Mac OS X 10.7 or later)

Похоже, Apple пытается заставить людей обновиться, не позволяя разработчикам поддерживать Snow Leopard. Меня это раздражает. Arrrggg!!!

Что я могу сделать?

РЕДАКТИРОВАТЬ: После нескольких комментариев назад и вперед должно быть ясно, что 10.6 не поставляется с библиотеками libС++. В результате просто невозможно создать проект libС++ для развертывания 10.6. Вам также необходимо будет включить файлы libС++ с вашим дистрибутивом 10.6 или статической ссылкой на них. Поэтому давайте продолжим с предпосылкой, что я уже это делаю.

ОБНОВЛЕНИЕ 1: Этот вопрос изначально предназначался для использования с Xcode 4.5.2 (последняя версия на момент запроса). С тех пор я обновился до Xcode 4.6.3 и обновил вопрос и ответ, чтобы отразить это.

ОБНОВЛЕНИЕ 2: С тех пор я обновился до Xcode 5.0.2. Техника, перечисленная в выбранном ответе ниже, работает по-прежнему.

ОБНОВЛЕНИЕ 3: С тех пор я обновился до Xcode 5.1. Техника, перечисленная в ответе ниже, пока не работает для этой версии!

ОБНОВЛЕНИЕ 4: С тех пор я обновился до Xcode 6.0.1. Ниже приведена методика, указанная в выбранном ниже ответе.

ОБНОВЛЕНИЕ 5: С тех пор я обновил до Xcode 7.1.1. Ниже приведена методика, указанная в выбранном ниже ответе, с одним важным предостережением. Вы должны отключить Биткодинг, используемый для AppThinning, поскольку версия LLVM с открытым исходным кодом не поддерживает его (и не должна). Таким образом, вам нужно будет переключаться между открытым исходным кодом и Apple LLVM clang, чтобы скомпилировать как 10.6, так и tvOS/watchOS (так как для этих ОС требуется биткодинг).

Ответ 1

Apple решила официально поддерживать libС++ на 10,7 и выше. Таким образом, версия clang/llvm, которая поставляется с проверками Xcode, проверяет, установлена ​​ли цель развертывания для 10.6 при использовании libС++ и не позволяет вам компилировать. Однако этот флаг не включен в версию с открытым исходным кодом clang/llvm.

Взгляните на эту тему: http://permalink.gmane.org/gmane.comp.compilers.clang.devel/17557

Итак, чтобы скомпилировать проект, использующий С++ 11 для развертывания 10.6, вам нужно предоставить Xcode версию с открытым исходным кодом. Вот один из способов сделать это:

  • Загрузите версию clang с открытым исходным кодом (используйте LLVM 3.1 для Xcode 4.5.x, используйте LLVM 3.2 для Xcode 4.6.x, используйте LLVM 3.3 для Xcode 5.0.x, используйте LLVM 3.5.0 для XCode 6.0.1, используйте LLVM 3.7.0 для XCode 7.1.1): http://llvm.org/releases/download.html
  • Сделайте резервную копию компилятора clang по умолчанию для Xcode и поместите его в безопасное место (если вы испортите!) Это расположено по адресу: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
  • Замените компилятор clang по умолчанию тем, который вы загрузили из [1]
  • chown the clang binary для root: wheel с sudo chown root:wheel clang из каталога bin, указанного в [2].
  • Запуск Xcode и компиляция!

ОБНОВЛЕНИЕ # 1. Этот метод в настоящее время не работает для Xcode 5.1 или новее, которое основано на LLVM 3.4. Когда я получу еще какое-то время, я попытаюсь найти решение для публикации здесь. Но если кто-то придумает решение передо мной, он должен опубликовать его в качестве ответа.

ОБНОВЛЕНИЕ # 2. К сожалению, я не могу вспомнить, нашел ли я решение для Xcode 5.1, однако я могу подтвердить, что этот метод все еще работает для Xcode 6.0.1. Я не тестировал в версиях, но это все равно могло работать.

ОБНОВЛЕНИЕ # 3. Этот метод по-прежнему работает с XCode 7.1.1 с использованием LLVM 3.7.0. Тем не менее, CLA с открытым исходным кодом LLVM не поддерживает Bitcoding. Поэтому вам нужно будет переключиться между компилятором с открытым исходным кодом и компилятором Apple, чтобы разработать как для 10.6, так и для tvOS/watchOS (которые требуют битового кодирования).

PS: двоичные файлы Mac OS X для LLVM 3.4 и 3.5.0 перечислены как "Clang for Darwin 10.9" на www.llvm.org/releases/download.html, а не как "Clang Binaries для Mac OS X" в предыдущие версии.

Ответ 2

Пока Xcode 4.5.x является текущей версией по умолчанию для OS X 10.8, вы можете иметь другие, более старые версии Xcode, такие как Xcode 3.2.6 для OS X 10.6, доступные на 10.8, если у вас есть доступ к их установщикам. Вам нужно будет убедиться, что вы установите их в уникальный каталог. Кроме того, одна вещь, которую вы не можете или не должны делать, - установить пакет Command Line Tools или установочный пакет старых Xcodes на вашу систему 10.8, то есть не на /usr или /System/Library. Вы можете использовать инструменты командной строки xcodebuild, xcode-select и xcrun для доступа к компонентам Xcode, отличным по умолчанию. Для получения дополнительной информации см. Их страницы man. Старшие версии Xcode доступны зарегистрированным пользователям developer.apple.com

ОБНОВЛЕНИЕ. Основываясь на ваших последующих комментариях, я считаю, что я пропустил суть вопроса, а также ответил на ваш собственный вопрос. Я думаю, что вы говорите, что вы обновили с 10,7 до 10,8, а не с 10,6 до 10,8, как я предполагал. Вы также не уточнили в исходном вопросе, что вы распространяете свою собственную версию Apple libc++ и друзей из 10.7 с помощью собственного приложения. Apple не упрощает в Xcode делать что-то подобное, поскольку уже давно политика Apple препятствует статической привязке к libs или распространению дублированных библиотек (что в некоторых случаях может нарушать условия лицензии). Для этой политики есть веские причины.

Суть в том, что libc++ поставляется только с OS X 10.7 или более поздними версиями. Никогда не было поддержки Apple libc++ в 10.6, поэтому она вводит в заблуждение, чтобы сказать, что она была удалена. Если вы хотите предоставить приложение, которое можно развернуть в системах 10.6 и более поздних версий, и в зависимости от libc++, самый безопасный подход - создать собственные clang/llvm и libc++, предназначенные для OS X 10.6, и использовать их для создания вашего проекта. Существуют различные способы сделать это, возможно, самым простым является использование версий MacPorts и установка цели развертывания в MacPorts для 10.6. Или сотворите все с нуля самостоятельно. Но изменение компилятора clang в Xcode 4.5 - плохая идея. И копирование библиотек Apple в одно приложение - это, как правило, плохая идея.

Если у вас есть решение, которое работает для вас, отлично. Но я бы не рекомендовал его другим.