Boost scaricati 1.55, bootstrap usando:
./bootstrap.sh --prefix=/usr/local/boost155 cxxflags="-arch i386 -arch x86_64" \
address-model=32_64 threading=multi macos-version=10.8 stage
Costruito utilizzando:
./b2 threading=multi link=static runtime-link=static \
cxxflags="-stdlib=libstdc++" linkflags="-stdlib=libstdc++"
rese in 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&)
che implica che la biblioteca è stata costruita con l'opzione -stdlib=libstdc++
- vale a dire che è collegata con la versione GNU del runtime C++.
Abbiamo purgare la costruzione utilizzando:
find . -name \*.o -print0 | xargs -0 rm
find . -name \*.a -print0 | xargs -0 rm
Se non lo facciamo, allora non è così ricostruire, e si finisce con lo stesso codice di prima. Successivo costruiamo utilizzando:
./b2 threading=multi link=static runtime-link=static \
cxxflags="-stdlib=libc++" linkflags="-stdlib=libc++"
rendimenti in 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()
che implica che è costruito contro libc++
.
Ciò può essere verificato utilizzando un semplice programma di test C++ (per indicare il collegamento):
#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()
quindi sì, è la compilazione con la bandiera in questione. Quello che indica che devi passare il -stdlib=libstdc++
a a tutto il che stai compilando se stai usando XCode 5 dato che ora usa per default -stdlib=libc++
. Ciò significa che qualsiasi libreria basata su C++ che dipende dallo stdlib c++
da cui si dipende deve anche essere compilato con lo stesso flag.
Fate attenzione con un incrementale build di spinta - se non eliminare i file .o
e .a
, non ottengono ricompilato in base alle mutate bandiere, che mantiene i file come compilato, quindi se fossero mal interpretato quindi si verifica il problema.
Si sta compilando la tua applicazione con '-stdlib = libstdC++'? perché sarà necessario anche – Petesh
@Petesh si sto compilando l'app con libstdC++ –
Scegli una libreria boost che hai costruito che * sicuramente * si affida a qualcosa in STL, esegui un nm su di esso, esegui il pipe attraverso 'C++ filt 'e controlla che stia menzionando' std :: __ 1 :: '. Se lo menziona, boost ** è ** stato costruito con 'libstdC++' e in questo caso non stai compilando/collegando correttamente la tua applicazione. – Petesh