web-dev-qa-db-ja.com

C ++ 11でhomebrew、gcc、llvmを使用する

これが私の問題です:gccまたはclangのいずれかによって提供されるC++ 11機能を使用したい。ただし、次の要件があります。

  1. 私はMacを使用しています
  2. 私は自作によって提供されるたくさんのライブラリに依存しています(そして本当にそれらを自分でコンパイルしたくない)。具体的には、OSG自体が他の多くのライブラリに依存しています。そしてブーストしますが、私はいつでもそれを自分でコンパイルできます。

Homebrewはgccのみを使用したいようです(間違っている場合は修正してください)。代わりにLLVMに切り替えるオプションが見つかりません。これは、まだすべてのライブラリがLLVMと互換性があるわけではないという事実が原因である可能性があることを理解していますが、それでも、互換性のあるライブラリにとっては優れた機能です。

GccのMacにプリインストールされているgccのバージョンは4.2です。 gcc 4.2には、必要なc ++ 11機能がありません。 homebrew経由で4.7をインストールしましたが、homebrewを使用するように設定する方法を検索すると、すべて実行しないでください(Macのgcc 4.2はVanillaバージョンではないため、入手した4.7バージョンはコンパイルできません。いくつかのこと)。

私の質問は次のとおりです。この問題を回避するために実装した提案や修正はありますか?自作をあきらめるべきですか? Homebrewが将来LLVMに切り替える計画があるかどうか誰かが知っていますか?これらの非互換性に対処する方法について、アップグレード計画を持っている人はいますか?

自作が長期的にgcc4.2にどのように依存し続けることができるかはわかりませんが、この問題に関する実際の議論は見つかりませんでした。

15
Abe Schneider

MacのデフォルトのGCCは、GNUの実際のGCCではありません。実際には、GCCのブランチであるLLVM-GCCです。数年前、LLVM-GCCは終了し、 DragonEgg に置き換えられました。これは、LLVMをGCCバックエンドとして使用するためのGCCプラグインです。

LLVM-GCCは単なるコンパイラフロントエンドであり、その役割はGCCフロントエンドを使用してソースコードをLLVM IRに変換することです[ LLVMの概要 11.3]。 IRが生成されると、LLVMバックエンドはそれを使用してバイナリコードを生成します。このステップはGCCとは何の関係もありません。

上記の目標は10.7から完全に達成され、そのコンポーネントはすべてLLVMが提供するフロントエンドであるclangによってコンパイルされました。

しかし、AppleはまだLLVM-GCCおよびGCCランタイムライブラリを保持しています。その目的は、一部のコードGCCのみをコンパイルする機会を提供することかもしれません。

それでは、あなたの質問に答えましょう:

  • C++ 11機能を使用する場合は、代わりにclang++ -stc=c++11 -stdlib=libc++を使用してください。そして clangはすでにすべてのc ++ 11機能をサポートしているかもしれません
  • LLVMをサポートする自作が必要な場合は、少なくともバックエンドではすでにサポートされています。
  • コンパイラフロントエンドとしてclangを使用して自作が必要な場合は、自作コミュニティのスケジュールによって異なります。たとえば、--with-c++11引数を追加して、clangを使用してboostをコンパイルできます。ただし、brew install autoconfの場合はこの引数を使用できません。実際、一部のコンポーネントはclangによって正しくコンパイルされない場合があります。
  • Clangでコンパイルできることがわかっているが、homebrewがまだサポートされていない場合は、対応するRubyスクリプトを$HOMEBREW_ROOT/Library/Formulaディレクトリでハックする必要があります。幸い、ほとんどの場合、 ./configure blablabla./configure blablabla CXX=clang++ -stc=c++11 -stdlib=libc++はうまく機能します。ちなみに、ハッキングが成功した場合は、 homebrew にプルリクエストを送信してください。

だから、それを試して楽しんでください。

8
Matt Yang

OS X Mountain Lion環境があり、C++ 11を使用しています。この回答では、自分のものをコンパイルしないという要件を破ります。

私はHomebrewを使用していますが、clangとlibc ++、およびそれらを使用して構築されたすべての数式を提供するために、Homebrewに依存することを諦めることをお勧めします。

私がやったこと、そして私が好きなことは、

  • リポジトリからllvm、clang、libc ++のクローンを作成します。
  • /opt/localにインストールし、/opt/local/bin/etc/pathsの一番上に配置します。
  • 新しいclangで開発用のものをビルドします。
  • gitのようなツールや私が開発しないものをインストールするためにHomebrewに任せてください。ただ使ってください。

/opt/localにインストールするためのclangビルド手順に従いました。

Libc ++の場合、1つの詳細:builditスクリプトを実行した後、includeディレクトリを/opt/local/lib/c++/v1にシンボリックリンクし(/opt/localのc​​langはこれをデフォルトディレクトリとして検索します)、またシンボリックリンクしましたlibsを/opt/local/lib/に(ただし、バイナリは/opt/local/libのlibc ++に自動的にリンクしないように見えます。そのためには install_name_tool を使用する必要があります)。

7
pepper_chico

使用する

clang++ -std=c++11 -stdlib=libc++ 

homebrew-dupsから最新のgccをインストールすることもできます

brew install [flags] https://raw.github.com/Homebrew/homebrew-dupes/master/gcc.rb
1
locojay