2012-06-18 14 views
8

Boost 1.49の問題により、C++プログラムでリンクフェーズを終了するのに問題があります。私はC++(-std=c++11 -libc=libc++)に切り替えました。このコードは、別のコード(boostも使用しています)でうまく動作します。ブーストは、自作で次のものを使用してインストールされました。boost::program_optionsでトラブルが始まります。LLVMを使用したOSXでのboost :: program_optionsとのトラブルシューティング

"boost::program_options::validate(boost::any&, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, int)", referenced from: 

... etc. ... 

ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

使用するライブラリのNMを行うことは、シンボルがあるように見えることを、明らかになったので、これは、少し奇妙です:

nm -U /usr/local/lib/libboost_program_options-mt.dylib | grep validate 
0000000000019880 - 01 0000 FUN __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISbIwSt11char_traitsIwESaIwEESaIS7_EEPSsi 
0000000000019880 T __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISbIwSt11char_traitsIwESaIwEESaIS7_EEPSsi 
00000000000199e0 - 01 0000 FUN __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISbIwSt11char_traitsIwESaIwEESaIS7_EEPbi 
00000000000199e0 T __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISbIwSt11char_traitsIwESaIwEESaIS7_EEPbi 
0000000000019930 T __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISsSaISsEEPSsi 
0000000000019930 - 01 0000 FUN __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISsSaISsEEPSsi 
0000000000019c70 - 01 0000 FUN __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISsSaISsEEPbi 
0000000000019c70 T __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISsSaISsEEPbi 

私はすでに試してみました私はこのようなリンクエラーを取得しますインストール前にCXXとCXX_FLAGSを設定してgccの代わりにclangを使ってブーストをコンパイルするためにhomebrewをcoaxingします。確かに私は成功した。

ポインタが大変感謝しています。

+0

と同じ質問です。http://stackoverflow.com/questions/8454329/why-cant-clang-with-libc-in-c0x-mode-link-this-boostprogram-options-examp –

答えて

8

clangとstd11フラグでboostを再コンパイルする必要があります。libC++ライブラリはOSXのインストール済みlibstdC++(gpl3に変更する前のgccの非常に古いバージョン)とバイナリ互換ではありません。 clangのバージョンが3.1以上であれば、それを使用することができます(そうしないと、以前のバージョンではC++ 11からC++ 0xに変更されます)。

./bootstrap.sh 
mkdir build 
sudo ./bjam toolset=clang cxxflags="-std=c++0x -stdlib=libc++" variant=release link=static threading=multi runtime-link=shared --build-dir=Build --layout=system --without-mpi --without-python install --prefix=/usr/local 

あなたは

ツールセット=打ち鳴らすのCXXFLAGS以外望むようにあなたはもちろん、これらのいずれかを変更することができます= " - STD = C++ 0xの-stdlib =のlibC++"

このあなたのために働くはずです。

+0

こんにちは、ありがとうポインタ。思ったほど。しかし、Boostには私のために動的ライブラリをコンパイルすることはできません。私はこれを試しました: 'sudo ./bjam toolset = clang cxxflags = " - std = C++ 11 -stdlib = libC++" variant =リリースリンク=共有スレッド=マルチランタイムリンク=共有--build-dir =ビルド--layout = system --without-mpi --without-python install --prefix =/usr/local ' しかし静的なものしか得られません。 –

+1

私は最終的にBoost.Buildフォーラムを通して答えを得た: http://boost.2283326.n4.nabble.com/Problems-building-Boost-with-clang-toolchain-and-C-11-td4631556.html bjamを呼び出すときに 'linkflags'が見つからない: ./b2 toolset = clang cxxflags = " - std = C++ 11 -stdlib = libC++" linkflags = " - stdlib = libC++" –

3

Xcode 5.0で提供されているMacOS X 10.8.5のBoost 1.54をclang 5.0.0でビルドした私の(苦痛な)私の経験を共有したいと思います。 C++ 11の機能を使用する場合は、clangではなく、clang++をコンパイルしてリンクすることが非常に重要です。

イラスト:あなたの代わりにこれをしようとした場合、

clang++ -std=c++11 -stdlib=libc++ clangstr.cc -o clangstr

しかし:

#include <iostream> 
#include <string> 

int main(int argc, char *argv[]) { 
    std::string str = "OK"; 
    std::cout << str << std::endl; 
    return 0; 
} 

は、次のコマンドを使用して構築することができます:以下の簡単なプログラムを取る

clang -std=c++11 -stdlib=libc++ clangstr.cc -o clangstr

リンカーエラーが発生します。 clangマンページによれば、言語は-std=オプションで選択されていますが、これでは十分ではありません。

bjamには、Boost with C++ 11をコンパイルするときに、clang++を明示的に使用するように指示する必要があります。

this very useful post後、私は私のtools/build/v2/user-config.jamに次のように置く:

using clang : 11 
    : "/usr/bin/clang++" 
    : <cxxflags>"-std=c++11 -stdlib=libc++ -ftemplate-depth=512" <linkflags>"-stdlib=libc++" 
    ; 

は、それから私は、私は、次のコマンドを使用してブーストを構築し、./b2 cleanを走った:

mkdir -p build/clangstage/ 
./b2 -j8 --build-dir=build --stagedir=build/clangstage toolset=clang-11 define=BOOST_SYSTEM_NO_DEPRECATED variant=release threading=multi address-model=64 stage 

これは64ビットの静的を構築しますマルチスレッドをサポートするダイナミックライブラリ別のセットが必要な場合は、それに応じて上記のコマンドを変更してください。

関連する問題