Hi, guys.
I'm curious if it is possible to use libc++ with Vuforia SDK 3.0? I see the libVuforia.a is build with libstdc++ but my application uses a lot of code that is libc++ dependent, so I would like to ask you to give developers a possibility to use libc++ in their projects (which is a default for iOS 5 and later). I think you can build two versions and provide them both to developers as such a restriction is really critical for some users as they don't have access to entire source code to build it from scratch using the standard library they need.
Now I have link errors in Xcode 5 (which are expected) like:
Undefined symbols for architecture armv7:
"vtable for std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >", referenced from:
l10743 in libVuforia.a(libVuforia.a-armv7-master.o)
l10754 in libVuforia.a(libVuforia.a-armv7-master.o)
l10798 in libVuforia.a(libVuforia.a-armv7-master.o)
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
"VTT for std::basic_istringstream<char, std::char_traits<char>, std::allocator<char> >", referenced from:
l10743 in libVuforia.a(libVuforia.a-armv7-master.o)
l10754 in libVuforia.a(libVuforia.a-armv7-master.o)
l10798 in libVuforia.a(libVuforia.a-armv7-master.o)
"std::cerr", referenced from:
l10744 in libVuforia.a(libVuforia.a-armv7-master.o)
l14918 in libVuforia.a(libVuforia.a-armv7-master.o)
"std::string::assign(std::string const&)", referenced from:
l14884 in libVuforia.a(libVuforia.a-armv7-master.o)
"std::ios_base::Init::~Init()", referenced from:
l15185 in libVuforia.a(libVuforia.a-armv7-master.o)
l15186 in libVuforia.a(libVuforia.a-armv7-master.o)
l15210 in libVuforia.a(libVuforia.a-armv7-master.o)
l15211 in libVuforia.a(libVuforia.a-armv7-master.o)
l15214 in libVuforia.a(libVuforia.a-armv7-master.o)
l15215 in libVuforia.a(libVuforia.a-armv7-master.o)
l15217 in libVuforia.a(libVuforia.a-armv7-master.o)
...
"std::_Rb_tree_decrement(std::_Rb_tree_node_base*)", referenced from:
l14755 in libVuforia.a(libVuforia.a-armv7-master.o)
l14756 in libVuforia.a(libVuforia.a-armv7-master.o)
"std::_Rb_tree_insert_and_rebalance(bool, std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)", referenced from:
l14755 in libVuforia.a(libVuforia.a-armv7-master.o)
l14756 in libVuforia.a(libVuforia.a-armv7-master.o)
"std::ostream::flush()", referenced from:
l10862 in libVuforia.a(libVuforia.a-armv7-master.o)
l14918 in libVuforia.a(libVuforia.a-armv7-master.o)
"std::basic_ios<char, std::char_traits<char> >::widen(char) const", referenced from:
l10752 in libVuforia.a(libVuforia.a-armv7-master.o)
l10862 in libVuforia.a(libVuforia.a-armv7-master.o)
l14918 in libVuforia.a(libVuforia.a-armv7-master.o)
"std::basic_istream<char, std::char_traits<char> >& std::getline<char, std::char_traits<char>, std::allocator<char> >(std::basic_istream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, char)", referenced from:
l10752 in libVuforia.a(libVuforia.a-armv7-master.o)
"vtable for std::basic_streambuf<char, std::char_traits<char> >", referenced from:
l10743 in libVuforia.a(libVuforia.a-armv7-master.o)
l10754 in libVuforia.a(libVuforia.a-armv7-master.o)
l10798 in libVuforia.a(libVuforia.a-armv7-master.o)
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
"std::basic_ios<char, std::char_traits<char> >::clear(std::_Ios_Iostate)", referenced from:
l10749 in libVuforia.a(libVuforia.a-armv7-master.o)
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&)", referenced from:
l10747 in libVuforia.a(libVuforia.a-armv7-master.o)
l10748 in libVuforia.a(libVuforia.a-armv7-master.o)
l10752 in libVuforia.a(libVuforia.a-armv7-master.o)
l14884 in libVuforia.a(libVuforia.a-armv7-master.o)
"std::istream& std::istream::_M_extract<unsigned int>(unsigned int&)", referenced from:
l10748 in libVuforia.a(libVuforia.a-armv7-master.o)
"std::cout", referenced from:
l10862 in libVuforia.a(libVuforia.a-armv7-master.o)
"std::_Rb_tree_increment(std::_Rb_tree_node_base*)", referenced from:
l14755 in libVuforia.a(libVuforia.a-armv7-master.o)
"std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, int)", referenced from:
l10744 in libVuforia.a(libVuforia.a-armv7-master.o)
l10862 in libVuforia.a(libVuforia.a-armv7-master.o)
"std::basic_istream<char, std::char_traits<char> >& std::operator>><char, std::char_traits<char>, std::allocator<char> >(std::basic_istream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)", referenced from:
l10748 in libVuforia.a(libVuforia.a-armv7-master.o)
l10749 in libVuforia.a(libVuforia.a-armv7-master.o)
l10751 in libVuforia.a(libVuforia.a-armv7-master.o)
"std::ios_base::Init::Init()", referenced from:
l15185 in libVuforia.a(libVuforia.a-armv7-master.o)
l15186 in libVuforia.a(libVuforia.a-armv7-master.o)
l15210 in libVuforia.a(libVuforia.a-armv7-master.o)
l15211 in libVuforia.a(libVuforia.a-armv7-master.o)
l15214 in libVuforia.a(libVuforia.a-armv7-master.o)
l15215 in libVuforia.a(libVuforia.a-armv7-master.o)
l15217 in libVuforia.a(libVuforia.a-armv7-master.o)
...
"std::string::find_first_of(char const*, unsigned long, unsigned long) const", referenced from:
l10747 in libVuforia.a(libVuforia.a-armv7-master.o)
"std::ostream::operator<<(int)", referenced from:
l10862 in libVuforia.a(libVuforia.a-armv7-master.o)
l14918 in libVuforia.a(libVuforia.a-armv7-master.o)
"std::string::compare(char const*) const", referenced from:
l10742 in libVuforia.a(libVuforia.a-armv7-master.o)
l10748 in libVuforia.a(libVuforia.a-armv7-master.o)
l10752 in libVuforia.a(libVuforia.a-armv7-master.o)
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&, unsigned long, unsigned long)", referenced from:
l10747 in libVuforia.a(libVuforia.a-armv7-master.o)
"std::ostream& std::ostream::_M_insert<unsigned long>(unsigned long)", referenced from:
l10862 in libVuforia.a(libVuforia.a-armv7-master.o)
"std::string::_Rep::_M_destroy(std::allocator<char> const&)", referenced from:
l10742 in libVuforia.a(libVuforia.a-armv7-master.o)
l10743 in libVuforia.a(libVuforia.a-armv7-master.o)
l10747 in libVuforia.a(libVuforia.a-armv7-master.o)
l10748 in libVuforia.a(libVuforia.a-armv7-master.o)
l10749 in libVuforia.a(libVuforia.a-armv7-master.o)
l10751 in libVuforia.a(libVuforia.a-armv7-master.o)
l10752 in libVuforia.a(libVuforia.a-armv7-master.o)
...
"std::string::_Rep::_S_empty_rep_storage", referenced from:
l10742 in libVuforia.a(libVuforia.a-armv7-master.o)
l10743 in libVuforia.a(libVuforia.a-armv7-master.o)
l10747 in libVuforia.a(libVuforia.a-armv7-master.o)
l10748 in libVuforia.a(libVuforia.a-armv7-master.o)
l10749 in libVuforia.a(libVuforia.a-armv7-master.o)
l10751 in libVuforia.a(libVuforia.a-armv7-master.o)
l10752 in libVuforia.a(libVuforia.a-armv7-master.o)
...
"std::locale::~locale()", referenced from:
l10743 in libVuforia.a(libVuforia.a-armv7-master.o)
l10754 in libVuforia.a(libVuforia.a-armv7-master.o)
l10798 in libVuforia.a(libVuforia.a-armv7-master.o)
"std::basic_istringstream<char, std::char_traits<char>, std::allocator<char> >::basic_istringstream(std::string const&, std::_Ios_Openmode)", referenced from:
l10743 in libVuforia.a(libVuforia.a-armv7-master.o)
l10754 in libVuforia.a(libVuforia.a-armv7-master.o)
l10798 in libVuforia.a(libVuforia.a-armv7-master.o)
"std::__throw_length_error(char const*)", referenced from:
l14873 in libVuforia.a(libVuforia.a-armv7-master.o)
l14879 in libVuforia.a(libVuforia.a-armv7-master.o)
l14880 in libVuforia.a(libVuforia.a-armv7-master.o)
l14884 in libVuforia.a(libVuforia.a-armv7-master.o)
l14885 in libVuforia.a(libVuforia.a-armv7-master.o)
l14949 in libVuforia.a(libVuforia.a-armv7-master.o)
l14979 in libVuforia.a(libVuforia.a-armv7-master.o)
...
"std::__throw_out_of_range(char const*)", referenced from:
l10747 in libVuforia.a(libVuforia.a-armv7-master.o)
"std::ostream& std::ostream::_M_insert<double>(double)", referenced from:
l10862 in libVuforia.a(libVuforia.a-armv7-master.o)
"std::istream::operator>>(int&)", referenced from:
l10743 in libVuforia.a(libVuforia.a-armv7-master.o)
l10748 in libVuforia.a(libVuforia.a-armv7-master.o)
l10752 in libVuforia.a(libVuforia.a-armv7-master.o)
l10754 in libVuforia.a(libVuforia.a-armv7-master.o)
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)", referenced from:
l10742 in libVuforia.a(libVuforia.a-armv7-master.o)
l10748 in libVuforia.a(libVuforia.a-armv7-master.o)
l10752 in libVuforia.a(libVuforia.a-armv7-master.o)
l10798 in libVuforia.a(libVuforia.a-armv7-master.o)
"std::ostream::put(char)", referenced from:
l10862 in libVuforia.a(libVuforia.a-armv7-master.o)
l14918 in libVuforia.a(libVuforia.a-armv7-master.o)
"std::ios_base::~ios_base()", referenced from:
l10743 in libVuforia.a(libVuforia.a-armv7-master.o)
l10754 in libVuforia.a(libVuforia.a-armv7-master.o)
l10798 in libVuforia.a(libVuforia.a-armv7-master.o)
"std::istream::get()", referenced from:
l10748 in libVuforia.a(libVuforia.a-armv7-master.o)
l10750 in libVuforia.a(libVuforia.a-armv7-master.o)
l10752 in libVuforia.a(libVuforia.a-armv7-master.o)
"std::istream& std::istream::_M_extract<float>(float&)", referenced from:
l10752 in libVuforia.a(libVuforia.a-armv7-master.o)
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Ok that was an error on my end... So I finally managed to make it work!
Glad to see that our recommendation worked for you :)
Now, a final question if you don't mind: do you plan to release a version which builds on libc++? That would be great!
Well it is not actually needed, and here is why:
The actual symbols in the two STLs don't collide because the libc++ uses an inline namespace __1 in its symbols. They are incompatible in all sorts of ways, but provided you don't try to pass an object that was allocated via one library into a function that was compiled against the other library, then it should be OK. Since Vuforia does not expose any STL symbols in its API, this should never happen.
Hope this makes sense.
N