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

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

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

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

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

РЕДАКТИРОВАТЬ: После нескольких комментариев туда и обратно следует пояснить, что 10.6 не поставляется с системными библиотеками libc ++. В результате, просто возможность собрать проект libc ++ для развертывания 10.6 недостаточно. Вам также необходимо включить двоичные файлы libc ++ в ваш дистрибутив 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. Техника, перечисленная в выбранном ответе ниже, кажется, снова работает, с одним важным предупреждением. Вы должны отключить Bitcoding используется для AppThinning, поскольку версия LLVM с открытым исходным кодом не поддерживает ее (и не должна). Таким образом, вам нужно будет переключаться между открытым исходным кодом и Apple LLVM clang, чтобы скомпилировать как для 10.6, так и для tvOS / watchOS (поскольку для этих ОС требуется биткодирование).

11

Решение

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

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

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

  1. Загрузите версию 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
  2. Сделайте резервную копию стандартного компилятора XClan по умолчанию и поместите его в безопасное место (на случай, если вы облажаетесь!)
    Это находится по адресу:
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
  3. Замените компилятор clang по умолчанию на тот, который вы скачали с [1]
  4. chown бинарный файл clang для root: wheel с sudo chown root:wheel clang из каталога bin, указанного в [2].
  5. Запустите 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. Тем не менее, открытый исходный код LLVM не поддерживает Bitcoding. Таким образом, вам нужно будет переключаться между компилятором с открытым исходным кодом и компилятором Apple, чтобы разрабатывать как для 10.6, так и для tvOS / watchOS (которые требуют Bitcoding).

P.S .: Двоичные файлы 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» в предыдущих версиях.

11

Другие решения

Хотя Xcode 4.5.x является текущей версией по умолчанию в OS X 10.8, у вас могут быть другие, более старые версии Xcode, такие как Xcode 3.2.6 для OS X 10.6, доступен на 10.8 до тех пор, пока у вас есть доступ к их установщикам. Вам нужно будет убедиться, что вы устанавливаете каждый из них в уникальный каталог. Кроме того, одна вещь, которую вы не можете или не должны делать, это установить Command Line Tools компонент или установочный пакет старых кодов X на вашу систему 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 придерживалась политики, направленной на предотвращение статического связывания с библиотеками или распространения дублированных библиотек (что в некоторых случаях может нарушать условия лицензии). Есть веские причины для такой политики.

Суть в том, что 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 в свое приложение — вообще плохая идея.

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

7

По вопросам рекламы [email protected]