我想用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)没有符号
答案 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