12

私は自分のプロジェクトで c++0x/c++11 の機能、特にコード ブロックと共有ポインターを多用しています。OS を 10.8 Mountain Lion にアップグレードしたとき (編集: 10.7 から)、Xcode のアップグレードを余儀なくされました。Xcode をアップグレードすると、次のエラーが発生するため、10.6 システムに配置するために C++ プロジェクトをコンパイルできなくなりました。

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

Apple は、開発者に Snow Leopard のサポートを許可しないことで、人々にアップグレードを強制しようとしているようです。これは私を怒らせます。アーゴッ!!!

私に何ができる?

編集:いくつかのコメントを行ったり来たりした後、10.6 にはシステム libc++ ライブラリが同梱されていないことを明確にする必要があります。その結果、10.6 デプロイメント用の libc++ プロジェクトをビルドできるだけでは十分ではありません。また、10.6 ディストリビューションに libc++ バイナリを含めるか、それらに静的にリンクする必要があります。ですから、私はすでにそれを行っているという前提で続けましょう。

更新 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 にアップグレードしました。以下の選択された回答にリストされている手法は、重要な注意点が 1 つありますが、再び機能しているようです。オープンソースの LLVM バージョンではサポートされていないため (サポートすべきではないため)、AppThinningに使用されるビットコーディングを無効にする必要があります。そのため、10.6 と tvOS/watchOS の両方でコンパイルするには、オープン ソースと Apple LLVM の clang を切り替える必要があります (これらの OS にはビットコーディングが必要なため)。

4

2 に答える 2

12

Apple は、10.7 以降の libc++ のみを正式にサポートすることを決定しました。そのため、Xcode に同梱されている clang/llvm のバージョンは、libc++ を使用する場合に展開ターゲットが 10.6 に設定されているかどうかを確認し、コンパイルを妨げます。ただし、このフラグはオープンソース版のclang/llvmには含まれていません。

このスレッドを見てください: http://permalink.gmane.org/gmane.comp.compilers.clang.devel/17557

そのため、10.6 デプロイメント用に c++11 を使用するプロジェクトをコンパイルするには、Xcode にオープン ソース バージョンを提供する必要があります。これを行う1つの方法は次のとおりです。

  1. ここからオープン ソース バージョンの clang をダウンロードします (Xcode 4.5.x には LLVM 3.1 を使用します。Xcode 4.6.x には LLVM 3.2 を使用します。Xcode 5.0.x には LLVM 3.3 を使用します。XCode 6.0.1 には LLVM 3.5.0 を使用します。LLVM を使用します)。 XCode 7.1.1 の場合は 3.7.0): http://llvm.org/releases/download.html
  2. Xcode のデフォルトの clang コンパイラのバックアップを作成し、安全な場所に置きます (失敗した場合に備えて!) これは /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang にあります
  3. デフォルトの clang コンパイラを [1] からダウンロードしたものに置き換えます。
  4. sudo chown root:wheel clang[2] に記載されている bin ディレクトリからroot:wheel の clang バイナリを chown します。
  5. Xcodeを起動してコンパイル!

更新 #1 : この手法は現在、LLVM 3.4 に依存する Xcode 5.1 以降では機能しません。もう少し時間ができたら、ここに投稿する解決策を見つけようとします。しかし、誰かが私の前に解決策を思いついた場合は、回答として投稿する必要があります.

更新 #2 : 残念ながら、Xcode 5.1 の解決策を見つけたかどうかは思い出せませんが、この手法が Xcode 6.0.1 でも機能することは確認できます。それより新しいバージョンではテストしていませんが、それでも動作する可能性があります。

更新 #3 : この手法は、LLVM 3.7.0 を使用する XCode 7.1.1 でも機能するようです。ただし、オープン ソースの LLVM clang は Bitcoding をサポートしていません。そのため、10.6 と tvOS/watchOS (ビットコーディングが必要) の両方で開発するには、オープン ソース コンパイラと Apple のコンパイラを切り替える必要があります。

PS: LLVM 3.4 および 3.5.0 用の Mac OS X バイナリは、以前のバージョンの「Clang Binaries for Mac OS X」ではなく、「Clang for Darwin 10.9」として www.llvm.org/releases/download.html にリストされています。

于 2013-01-24T05:21:01.160 に答える
8

Xcode 4.5.x が OS X 10.8 の現在のデフォルト バージョンですが、OS X 10.6 用の Xcode 3.2.6など、他の古いバージョンの Xcodeを、インストーラーにアクセスできる限り、10.8 で使用できます。それぞれを一意のディレクトリにインストールする必要があります。Command Line Toolsまた、古い Xcode のコンポーネントまたはインストーラー パッケージを 10.8 システムにインストールすることは、できないこと、またはすべきでないことの 1 つ/usrです/System/Libraryxcodebuildxcode-select、およびコマンド ライン ツールを使用して、xcrunデフォルト以外の Xcode コンポーネントにアクセスできます。詳細については、それらのmanページを参照してください。Xcode の古いバージョンは、developer.apple.com の登録ユーザーが利用できます。

更新:その後のコメントに基づいて、私は質問の要点を見逃していたと思います。また、あなたは自分の質問に答えていたと思います。あなたが言っているのは、私が想定していた 10.6 から 10.8 ではなく、10.7 から 10.8 にアップグレードしたということだと思います。libc++また、元の質問では、10.7 から独自のバージョンの Apple や友人を独自のアプリで配布していることを明確にしませんでした。Apple は Xcode でそのようなことを簡単に行うことはできません。これは長い間、ライブラリとの静的リンクや重複したライブラリの配布 (場合によってはライセンス条項に違反する可能性がある) を思いとどまらせることが Apple のポリシーであったためです。そのポリシーには正当な理由があります。

libc++肝心なのは、OS X 10.7 以降のシステムにのみ同梱されているということです。10.6 ではApple によるサポートはなかったlibc++ので、削除されたと言うのは誤解を招きます。10.6 以降のシステムにデプロイ可能で、に依存するアプリを提供する場合libc++、最も安全な方法は、libc++OS X 10.6 を対象とする独自の clang/llvm をビルドし、それを使用してプロジェクトをビルドすることです。これにはさまざまな方法がありますが、おそらく最も簡単な方法は、MacPorts バージョンを使用し、MacPorts で 10.6 の展開ターゲットを設定することです。または、自分ですべてをゼロから構築します。しかし、Xcode 4.5 内で clang コンパイラーを変更するのは悪い考えです。また、Apple ライブラリを自分のアプリにコピーすることは、一般的には悪い考えです。

あなたに合った解決策があれば、素晴らしいです。しかし、私はそれを他の人にはお勧めしません。

于 2013-01-24T06:10:52.943 に答える