8

Boost 1.49の問題が原因で、C++プログラムのリンクフェーズを通過できません。私はC++()に切り替えました-std=c++11 -libc=libc++。これは、別のコード(これもブーストを使用します)で正常に機能します。Boostは自作を使用してインストールされました:

brew install boost --universal --with-mpi --with-icu

トラブルはで始まり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を使用してboostをコンパイルするように自作を説得しようとしました。でも成功したかどうかはわかりません。

ポインタは大歓迎です。

4

2 に答える 2

8

ブーストを clang および std11 フラグで再コンパイルする必要があります。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 

もちろん、必要に応じてこれらを変更することもできます。

ツールセット=clang cxxflags="-std=c++0x -stdlib=libc++"

これはうまくいくはずです。

于 2012-06-18T16:50:31.033 に答える
3

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

イラスト: 次の簡単なプログラムを考えてみましょう:

#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=c++11 -stdlib=libc++ clangstr.cc -o clangstr

その後、リンカーエラーが発生します。マンページclangには、言語は-std=オプションで選択されると書かれていますが、これでは明らかに十分ではありません。

教訓は、Boost を C++11 サポートでコンパイルするときbjamに明示的に使用するように指示する必要があるということです。clang++

この非常に便利な投稿に続いて、私は以下を my に入れました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し、次のコマンドで Boost をビルドしました。

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 ビットの静的および動的ライブラリがビルドされます。別のセットが必要な場合は、上記のコマンドを適宜変更してください。

于 2013-10-17T14:40:07.363 に答える