"We offer new support options and therefor the forums are now in read-only mode! Please check out our Support Center for more information." - Vuforia Engine Team

libc++ standard library support

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)

+1 to libc++ linkage

I've been using 2.8.3 previously with my C++11 code and everything worked like a charm. With the new 3.0.5 build my app now fails to link due to the same issues like topicstarter have.  

Ok, I checked with the Development Team and this ought to work.

Essentially you should be able to get this working by linking with both STLs which should be possible.

In Build Settings in XCode you can leave the setting for "C++ Standard Library" set for C++11.

Hi!

I just faced this very issue, with the exact same linker errors as the OP.

I tried different ways to link with both libs, including your proposed solution, but that hasn't fixed the issue, I'm still getting the linker errors.

What I tried:

bond007bond007…

Wed, 07/02/2014 - 08:00

What you are proposing to do is not a good idea actually because of big difference in implementations of C++ standard libraries.

Hi! Thanks for your quick response.

Yes, I do know that Apple doesn't support beyond GCC 4.2 and that's precisely why we don't want to switch our whole project to libstdc++ and keep building with libc++.

Yep, I put exactly the path you mentioned in the "Other Linker Flags" options under the "Linking" section.

Mine is as follows:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk/usr/lib/libstdc++.dylib

Ok that was an error on my end. We have a hierarchy of projects, with mutliple project settings that are set in multiple places and the project file I was editing had its settings overriden by another one.

So I finally managed to make it work!