如何使用stdlibc ++编译OS X 64b平台的boost?

时间:2013-11-20 22:27:27

标签: c++ macos boost clang libstdc++

我想用stdlibc ++编译Mac OS X 10.9的boost。我运行以下命令:

./b2 threading=multi link=static runtime-link=static cxxflags="-stdlib=libstdc++" linkflags="-stdlib=libstdc++"

构建成功完成;但是,我的应用程序构建在链接时失败,当它找不到符号时,std :: __ 1 :: locale :: use_facet,std :: __ 1 :: basic_string等。我相信__1的相关细节。

我的问题是,如何使用stdlibc ++编译OSX 64b平台的boost?

更多信息:

我在编译期间注意到以下日志:

  

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib:file:bin.v2 / libs / filesystem / build / clang-darwin-4.2.1 / release / link- static / runtime-link-static / threading-multi / libboost_filesystem.a(windows_file_codecvt.o)没有符号

2 个答案:

答案 0 :(得分:21)

下载Boost 1.55,使用:

进行自举
./bootstrap.sh --prefix=/usr/local/boost155 cxxflags="-arch i386 -arch x86_64" \
    address-model=32_64 threading=multi macos-version=10.8 stage

使用:

构建
./b2 threading=multi link=static runtime-link=static \
    cxxflags="-stdlib=libstdc++" linkflags="-stdlib=libstdc++"

libboost_chrono.a的收益率:

     U std::string::_Rep::_M_destroy(std::allocator<char> const&)
     U std::string::_Rep::_S_empty_rep_storage
     U std::string::append(char const*, unsigned long)
     U std::string::append(std::string const&)
     U std::string::assign(char const*, unsigned long)
     U std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)
     U std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&)

这意味着库是使用选项-stdlib=libstdc++构建的 - 即它与C ++运行时的gnu版本链接。

我们使用以下方法清除构建:

find . -name \*.o -print0 | xargs -0 rm
find . -name \*.a -print0 | xargs -0 rm

如果我们不这样做,那么它就不会重建,你最终会得到与以前相同的代码。接下来我们使用:

构建
./b2 threading=multi link=static runtime-link=static \
    cxxflags="-stdlib=libc++" linkflags="-stdlib=libc++"

libboost_chrono.a的收益率:

     U std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::append(char const*)
     U std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::append(char const*, unsigned long)
     U std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::assign(char const*)
     U std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
     U std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_string()

这意味着它是针对libc++构建的。

这可以通过使用简单的测试c ++程序(以指示链接)来验证:

#include <string>

int
main(int argc, char **argv)
{
    std::string s("Hello World");
    return 0;
}

$ make test
c++     test.cpp   -o test
$ nm ./test | c++filt
                 U std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init(char const*, unsigned long)
                 U std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_string()

$ rm test
$ make test CXXFLAGS=-stdlib=libstdc++
c++ -stdlib=libstdc++    test.cpp   -o test
$ nm ./test | c++filt
                 U std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)
                 U std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()

是的,它正在使用相关标志进行编译。它的作用表明,如果您正在使用XCode 5,则必须将-stdlib=libstdc++传递给您正在编译的一切,因为它现在默认使用-stdlib=libc++。这意味着依赖于c++ stdlib的任何基于C ++的库也必须使用相同的标志进行编译。

小心使用 incremental 构建的boost - 如果不清除.o.a文件,则不会根据更改的标志重新编译它们,它将文件保存为已编译,因此如果它们被错误编译,那么您会遇到问题。

答案 1 :(得分:0)

我使用一个简单的命令行来执行boost邮件列表中的技巧: http://lists.boost.org/boost-users/2014/02/81274.php

如果链接不再起作用,这是片段:

$ cd tools/build/v2/ 
$ ./bootstrap.sh 
$ cd ~/boost-stdc++-install/boost_1_54_0 
$ cd ~/boost-stdc++-install/boost_1_54_0 
$ tools/build/v2/b2 \ 
     --build-dir=`pwd`/tmp/build/ \ 
     --stagedir=`pwd`/tmp/stage/ \ 
     --buildid=libstdc++ \ 
     --layout=tagged -j24 \ 
     toolset=clang \ 
     cxxflags="-ftemplate-depth=999 -stdlib=libstdc++" \ 
     linkflags="-stdlib=libstdc++" \ 
     define=BOOST_SYSTEM_NO_DEPRECATED stage