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

MM.*_*MM. 8 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++"
Run Code Online (Sandbox Code Playgroud)

构建成功完成; 但是,我的应用程序构建在链接时失败,当它找不到符号时,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)没有符号

Pet*_*esh 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
Run Code Online (Sandbox Code Playgroud)

建造使用:

./b2 threading=multi link=static runtime-link=static \
    cxxflags="-stdlib=libstdc++" linkflags="-stdlib=libstdc++"
Run Code Online (Sandbox Code Playgroud)

产量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&)
Run Code Online (Sandbox Code Playgroud)

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

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

find . -name \*.o -print0 | xargs -0 rm
find . -name \*.a -print0 | xargs -0 rm
Run Code Online (Sandbox Code Playgroud)

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

./b2 threading=multi link=static runtime-link=static \
    cxxflags="-stdlib=libc++" linkflags="-stdlib=libc++"
Run Code Online (Sandbox Code Playgroud)

产量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()
Run Code Online (Sandbox Code Playgroud)

这意味着它是建立起来的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()
Run Code Online (Sandbox Code Playgroud)

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

注意增量构建的boost - 如果你不清除.o.a文件,它们不会根据更改的标志重新编译,这会使文件保持编译状态,所以如果它们被错误编译,那么你会遇到问题.