15

C++11 標準を広範囲に使用する C++ プロジェクトをコンパイルしようとしています。-std=c++11 だけですべてがうまくいっていましたが、unordered_map を使用しようとすると、MacOS が unordered_map ヘッダー ファイルを usr/include のどこにも持っていませんでした。

私はいくつかの調査を行い、 -stdlib=libc++ を使用するとそれが修正されることがわかりました(インクルードファイルがファイルシステムのどこにもない場合、これは魔法のように思えます)。確かにそうでした。コンパイルはうまくいきましたが、リンカは、私のプログラムでも広く使用されている boost::program_options にリンクできません。-stdlib=libc++ を使用しないと、リンクが完全に強化されますが、unordered_map が失われます。

Mac OSのclang ++コンパイラで最新のC ++ 11機能を使用し、ブーストライブラリ(このMacのソースからビルドされたもの)にリンクできるようにするにはどうすればよいですか

ps: Arch Linux ボックスではすべて正常に動作します

私のメイクファイル:

LIBS = -lboost_program_options CXXFLAGS = -stdlib=libc++ -std=c++11 -Wall -g OBJ = fastq.o fastq_reader.o main.o degenerate.o interleave.o Complement.o interval_utils.o interval.o interval_utils_test_tool.o

フォグホーン: $(OBJ) $(LINK.cc) -o $@ $^ $(LIBS)

-stdlib=libc++ を使用した出力

$ make c++ -stdlib=libc++ -std=c++11 -Wall -g -c -o fastq.o fastq.cpp c++​​ -stdlib=libc++ -std=c++11 -Wall -g -c -o fastq_reader. o fastq_reader.cpp c++​​ -stdlib=libc++ -std=c++11 -Wall -g -c -o main.o main.cpp c++​​ -stdlib=libc++ -std=c++11 -Wall -g -c -o degenerate.o degenerate.cpp c++​​ -stdlib=libc++ -std=c++11 -Wall -g
-c -o interleave.o interleave.cpp c++​​ -stdlib=libc++ -std=c++11 -Wall -g -c -o 補数.o 補数.cpp c++​​ -stdlib=libc++ -std=c++11 -Wall -g -c -o interval_utils.o interval_utils.cpp c++​​ -stdlib=libc++ -std=c++11 -Wall -g -c -o interval.o interval.cpp c++​​ -stdlib=libc++ -std=c++11 -Wall -g -c -o interval_utils_test_tool.o interval_utils_test_tool.cpp c++​​ -stdlib=libc++ -std=c++11 -Wall -g
-o foghorn fastq.o fastq_reader.o main.o degenerate.o interleave.o Complement.o interval_utils.o interval.o interval_utils_test_tool.o -lboost_program_options アーキテクチャ x86_64 の未定義シンボル: __1::basic_string, std::__1::allocator > const&)"、次から参照: std::__1::vector、std::__1::allocator >、std::__1::allocator、std::__1: :allocator > > > boost::program_options::to_internal, std::__1::allocator >

(std::__1::vector, std::__1::allocator >, std::__1::allocator, std::__1::allocator > > > const&) in main.o

  ... [clipped output for readability]

ld: アーキテクチャ x86_64 のシンボルが見つかりません clang:エラー: リンカー コマンドが終了コード 1 で失敗しました (呼び出しを確認するには -v を使用してください)

4

1 に答える 1

30

編集: 最新の MacOS については、以下のコメントを参照してください。--c++11 フラグは無効になりました

多くの研究の後、私は次のことを学びました。

  • MacOS X のすべては stdlibc++ を使用して構築されています (homebrew でインストールするすべてのものを含みます。これは私の場合でした)。
  • gcc 4.2 に付属する stdlibc++ は、c++11 の多くの機能を実装していません。例は、unordered_map、to_string、stoi などです。libc++ だけが行います。
  • libc++ は XCode によって MacOS にインストールされます。

結論:

  • C++11 を使用している場合、-stdlib=libc++ を使用する必要があります。
  • boost やその他のライブラリを使用する場合は、-stdlib=libc++ を使用して再コンパイルする必要があります。

そこで、彼らの Web サイトからブースト ソースをダウンロードし、次のコマンド ラインを使用してコンパイルしました。

bootstrap.sh && b2 toolset=clang cxxflags="-stdlib=libc++" linkflags="-stdlib=libc++" install

Homebrew を使用している場合は、次のようにして実行できます。

brew install boost --c++11 
于 2013-08-09T04:18:21.940 に答える