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
文件,它们不会根据更改的标志重新编译,这会使文件保持编译状态,所以如果它们被错误编译,那么你会遇到问题.
归档时间: |
|
查看次数: |
8908 次 |
最近记录: |