C++ 如何使用stdlibc++;?
我想用stdlibc++为MacOSX10.9编译boost。我运行以下命令: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等等
./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-这会破坏预编译的头文件,希望它能让您解决这个问题。