C++ 如何使用stdlibc++;?

C++ 如何使用stdlibc++;?,c++,macos,boost,clang,libstdc++,C++,Macos,Boost,Clang,Libstdc++,我想用stdlibc++为MacOSX10.9编译boost。我运行以下命令: ./b2 threading=multi link=static runtime-link=static cxxflags="-stdlib=libstdc++" linkflags="-stdlib=libstdc++" 构建成功完成;然而,我的应用程序构建在链接时失败,因为它找不到符号,比如std::\uuu 1::locale::use\u facet、std::\uu 1::basic\u string等等

我想用stdlibc++为MacOSX10.9编译boost。我运行以下命令:

./b2 threading=multi link=static runtime-link=static cxxflags="-stdlib=libstdc++" linkflags="-stdlib=libstdc++"
构建成功完成;然而,我的应用程序构建在链接时失败,因为它找不到符号,比如std::\uuu 1::locale::use\u facet、std::\uu 1::basic\u string等等。我相信相关的细节是u 1

我的问题是,如何使用stdlibc++为OSX64B平台编译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\u filesystem.a(windows\u file\u codecvt.o)没有符号


已下载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\u 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&)
     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()
如果我们不这样做,那么它就不会重建,您最终会得到与以前相同的代码。接下来,我们使用:

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\u 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&)
     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()
是的,它是用相关的标志编译的。它表明,如果使用XCode 5,您必须将
-stdlib=libstdc++
传递给正在编译的所有内容,因为现在默认使用
-stdlib=libc++
。这意味着,<强> >依赖于<代码> C++ C++ > /COD> STDLIB的任何基于/<强> C++的库也必须用相同的标志编译。< /P>
在增量构建boost时要小心-如果不清除
.o
.a
文件,它们不会根据更改的标志重新编译,这会使文件保持编译状态,因此如果它们被错误编译,那么您会遇到问题。

我使用一个简单的命令行来完成boost邮件列表中的技巧:

这是链接不再工作时的代码段:

$ 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 

您正在使用
-stdlib=libstdc++
编译应用程序?因为那也会是needed@Petesh是的,我正在用libstdc++编译这个应用程序。选择一个你构建的boost库,它肯定依赖于STL中的某些东西,在它上面运行一个nm,通过
c++filt
,检查它是否提到
std::\uu 1::
。如果它提到了这一点,那么boost是用
libstdc++
构建的,在这种情况下,您没有正确编译/链接应用程序。@Petesh如果我在libboost\u文件系统上执行这些步骤,我会看到预期的命名空间。然而,我确实注意到在我的编译日志中有以下消息>/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\u filesystem.a(windows\u file\u codecvt.o)没有符号我有一个巨大的大脑放屁。boost是用libc++编译的,而不是libstdc++。我正在失去理智(为这方面的误导道歉)。你有没有办法在FreeBSD下编译它?当我尝试在FreeBSD下使用以下命令编译boost时,
sudo./b2-j4 threading=multi-link=static toolset=clang cxflags=“-stdlib=libstdc++”linkflags=“-stdlib=libstdc++
,我有以下错误
libs/atomic/src/lockpool.cpp:15:10:致命错误:'cstdef'文件未找到#include
您在新版本的FreeBSD(11.0?)上编译,该版本没有安装
gcc
libstdc++
。您首先需要确保它们已安装在系统上;然后你就可以建造它了。FreeBSD项目从
gcc
转移到
clang
,因此从长远来看,您最好使用clang构建所有内容,而不是试图让它正常工作。Petesh,感谢您的快速回复!是的,我安装了FreeBDS11.0,实际上我安装了
gcc
,这里是
定位
输出:
/usr/local/lib/gcc48/{libstdc++.a,libstdc++.so,libstdc++.so.6,libstdc++.so.6.0.19,libstdc++.py,libstdc++.a,libstdc++.so,libstdc++.6.0.20-gdb.py/{libstdc++.a,libstdc++.so,libstdc++.so.6,libstdc++.so.6.0.21,libstdc++.so.6.0.21-gdb.py,libstdc++.fs.a}/usr/ports/lang/libstdc++\u stldoc_4.2.2/{Makefile,distinfo,pkg descr}
在这种情况下可能会出现什么问题?使用
toolset=clang
-stdlib=libstdc++
将不起作用-它依赖于使用该支持编译的clang,而不是在FreeBSD上。您必须使用gcc引导并构建boost,以获得libstdc++支持-
/bootstrap.sh--使用toolset=gcc&/b2-j4 threading=multi link=static
看起来是与预编译头相关的内部编译器错误-可能是特定于编译器的。作为一种潜在的解决方法,请执行
rm bin.v2/libs/math/build/gcc-5.4.0/release/link static/threading multi/。/src/tr1/pch.hpp.gch&&touch bin.v2/libs/math/build/gcc-5.4.0/release/link static/threading multi/。/src/tr1/pch、 gch
然后重新运行b2-这会破坏预编译的头文件,希望它能让您解决这个问题。