Errors in Tesseract integration in iOS app

I am getting some errors while integrating Tesseract SDK in my iOS app. The procedure I followed is

1) Dragged "libtesseract_full.a" into xcode 2) Dragged "tessdata" folder into xcode 3) Dragged "baseapi.h" into xcode

Now when I am using Tesseract -

// init the tesseract engine.
tess = new TessBaseAPI();

tess->SimpleInit([dataPath cStringUsingEncoding:NSUTF8StringEncoding],  // Path to tessdata-no ending /.
                 "eng",  // ISO 639-3 string or NULL.
                 false);

      

I am getting these below errors (I think there is some framework or something like this is missing, but not getting what is missing, tesseract demo project works fine on my system)

clang: warning: argument unused during compilation: '-stdc++'
ld: warning: CPU_SUBTYPE_ARM_ALL subtype is deprecated: /Users/saurabhsharma/Desktop/Tess/SnapXv2/libtesseract_full.a(libtesseract_full.o)
Undefined symbols for architecture armv7:
  "std::basic_ostream<char, std::char_traits<char> >& std::operator<<<std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from:
      SVNetwork::SVNetwork(char const*, int) in libtesseract_full.a(libtesseract_full.o)
  "std::_Rb_tree_decrement(std::_Rb_tree_node_base*)", referenced from:
      std::_Rb_tree_iterator<std::pair<char const* const, int> >::operator--() in libtesseract_full.a(libtesseract_full.o)
      std::_Rb_tree_iterator<std::pair<int const, VariableContent*> >::operator--() in libtesseract_full.a(libtesseract_full.o)
      std::_Rb_tree_iterator<std::pair<std::pair<ScrollView*, SVEventType> const, std::pair<SVSemaphore*, SVEvent*> > >::operator--() in libtesseract_full.a(libtesseract_full.o)
      std::_Rb_tree_iterator<std::pair<int const, ScrollView*> >::operator--() in libtesseract_full.a(libtesseract_full.o)
  "std::string::operator+=(char const*)", referenced from:
      ScrollView::SendPolygon() in libtesseract_full.a(libtesseract_full.o)
  "std::ios_base::Init::Init()", referenced from:
      __static_initialization_and_destruction_0(int, int) in libtesseract_full.a(libtesseract_full.o)
      __static_initialization_and_destruction_0(int, int) in libtesseract_full.a(libtesseract_full.o)
  "std::string::size() const", referenced from:
      SVNetwork::Flush() in libtesseract_full.a(libtesseract_full.o)
  "std::__throw_length_error(char const*)", referenced from:
      std::vector<int, std::allocator<int> >::_M_insert_aux(__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, int const&) in libtesseract_full.a(libtesseract_full.o)
  "std::string::erase(unsigned long, unsigned long)", referenced from:
      SVNetwork::Flush() in libtesseract_full.a(libtesseract_full.o)
  "std::_Rb_tree_rebalance_for_erase(std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)", referenced from:
      std::_Rb_tree<int, std::pair<int const, ScrollView*>, std::_Select1st<std::pair<int const, ScrollView*> >, std::less<int>, std::allocator<std::pair<int const, ScrollView*> > >::erase(std::_Rb_tree_iterator<std::pair<int const, ScrollView*> >) in libtesseract_full.a(libtesseract_full.o)
      std::_Rb_tree<std::pair<ScrollView*, SVEventType>, std::pair<std::pair<ScrollView*, SVEventType> const, std::pair<SVSemaphore*, SVEvent*> >, std::_Select1st<std::pair<std::pair<ScrollView*, SVEventType> const, std::pair<SVSemaphore*, SVEvent*> > >, std::less<std::pair<ScrollView*, SVEventType> >, std::allocator<std::pair<std::pair<ScrollView*, SVEventType> const, std::pair<SVSemaphore*, SVEvent*> > > >::erase(std::_Rb_tree_iterator<std::pair<std::pair<ScrollView*, SVEventType> const, std::pair<SVSemaphore*, SVEvent*> > >) in libtesseract_full.a(libtesseract_full.o)
  "std::string::length() const", referenced from:
      SVNetwork::Flush() in libtesseract_full.a(libtesseract_full.o)
  "std::string::operator+=(char)", referenced from:
      ScrollView::SendPolygon() in libtesseract_full.a(libtesseract_full.o)
  "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()", referenced from:
      ScrollView::SendPolygon() in libtesseract_full.a(libtesseract_full.o)
      SVNetwork::SVNetwork(char const*, int) in libtesseract_full.a(libtesseract_full.o)
  "std::_Rb_tree_increment(std::_Rb_tree_node_base*)", referenced from:
      std::_Rb_tree_iterator<std::pair<int const, VariableContent*> >::operator++() in libtesseract_full.a(libtesseract_full.o)
      std::_Rb_tree_iterator<std::pair<char const* const, int> >::operator++() in libtesseract_full.a(libtesseract_full.o)
      std::_Rb_tree_iterator<std::pair<int const, ScrollView*> >::operator++() in libtesseract_full.a(libtesseract_full.o)
      std::_Rb_tree_iterator<std::pair<std::pair<ScrollView*, SVEventType> const, std::pair<SVSemaphore*, SVEvent*> > >::operator++() in libtesseract_full.a(libtesseract_full.o)
      std::_Rb_tree_iterator<std::pair<int const, ScrollView*> >::operator++(int) in libtesseract_full.a(libtesseract_full.o)
      std::_Rb_tree_iterator<std::pair<std::pair<ScrollView*, SVEventType> const, std::pair<SVSemaphore*, SVEvent*> > >::operator++(int) in libtesseract_full.a(libtesseract_full.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:
      std::_Rb_tree<int, std::pair<int const, VariableContent*>, std::_Select1st<std::pair<int const, VariableContent*> >, std::less<int>, std::allocator<std::pair<int const, VariableContent*> > >::_M_insert(std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::pair<int const, VariableContent*> const&) in libtesseract_full.a(libtesseract_full.o)
      std::_Rb_tree<char const*, std::pair<char const* const, int>, std::_Select1st<std::pair<char const* const, int> >, std::less<char const*>, std::allocator<std::pair<char const* const, int> > >::_M_insert(std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::pair<char const* const, int> const&) in libtesseract_full.a(libtesseract_full.o)
      std::_Rb_tree<int, std::pair<int const, ScrollView*>, std::_Select1st<std::pair<int const, ScrollView*> >, std::less<int>, std::allocator<std::pair<int const, ScrollView*> > >::_M_insert(std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::pair<int const, ScrollView*> const&) in libtesseract_full.a(libtesseract_full.o)
      std::_Rb_tree<std::pair<ScrollView*, SVEventType>, std::pair<std::pair<ScrollView*, SVEventType> const, std::pair<SVSemaphore*, SVEvent*> >, std::_Select1st<std::pair<std::pair<ScrollView*, SVEventType> const, std::pair<SVSemaphore*, SVEvent*> > >, std::less<std::pair<ScrollView*, SVEventType> >, std::allocator<std::pair<std::pair<ScrollView*, SVEventType> const, std::pair<SVSemaphore*, SVEvent*> > > >::_M_insert(std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::pair<std::pair<ScrollView*, SVEventType> const, std::pair<SVSemaphore*, SVEvent*> > const&) in libtesseract_full.a(libtesseract_full.o)
  "std::ios_base::Init::~Init()", referenced from:
      ___tcf_0 in libtesseract_full.a(libtesseract_full.o)
      ___tcf_0 in libtesseract_full.a(libtesseract_full.o)
  "std::string::c_str() const", referenced from:
      ScrollView::SendPolygon() in libtesseract_full.a(libtesseract_full.o)
      SVNetwork::Flush() in libtesseract_full.a(libtesseract_full.o)
  "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string()", referenced from:
      ScrollView::SendPolygon() in libtesseract_full.a(libtesseract_full.o)
      SVNetwork::SVNetwork(char const*, int) in libtesseract_full.a(libtesseract_full.o)
  "std::string::append(char const*)", referenced from:
      SVNetwork::Send(char const*) in libtesseract_full.a(libtesseract_full.o)
  "std::cout", referenced from:
      SVNetwork::SVNetwork(char const*, int) in libtesseract_full.a(libtesseract_full.o)
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

      

Any help would be appreciated.

+3


source to share


4 answers


just changed the "C ++ Standard Library" in build settings to "libstdC ++ (GNU C ++ Standard Library)" and the errors were gone ... Thanks @ H2CO3 for the hint.



+20


source


There are several problems:

First make sure the file contains the code:

tess = new TessBaseAPI();
tess->SimpleInit(...);

      

has a file extension .mm

(Objective-C ++) as it uses both Objective-C and C ++.



Second, the library looks as if it has not been compiled for armv7

, so you will need to rebuild it for all architectures that you want to support, and it will be one or more of the armv6

, armv7

, armv7s

and i386

(for the iPhone Simulator).

If you are targeting iOS 5.0+, then this will be all of the above separately from armv6

which is not supported in later versions of Xcode.

Third, make sure you are using the same C ++ and C ++ library version both in the library and in the application, otherwise there will be bad things.

+1


source


Make sure that:

Set of C ++ dialogs "Default compiler" instead of "GNU ++ 11 [-std = gnu ++ 11]"

C ++ Standard Library Install "Default Compiler" instead of "libC ++ (LLVM C ++ Standard Library with C ++ 11 Support)"

Also check:

C Language Dialog Set "C00 [-std = c99]" instead of "GNU00 [-std = gnu99]"

and the tesseract files must be listed correctly. (drag and drop files are not referenced correctly)

0


source


ld: -weak_library and -bitcode_bundle (Xcode setting ENABLE_BITCODE=YES) cannot be used together
clang: error: linker command failed with exit code 1 (use -v to see invocation)

      

  • Change Project -> Project -> Build Settings -> ** "Include Bitcode" to NO

  • also remove all linker flags in "linking" -> "Other Linker Flags" and add this

Linker flags  3. After that, install pods with the "pod install" command

It works for me on Swift 2 and Xcode 7.2 (beta)

0


source







All Articles