简体   繁体   中英

Errors in Tesseract integration in iOS app

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

1) Dragged "libtesseract_full.a" in xcode 2) Dragged "tessdata" folder in xcode 3) Dragged "baseapi.h" in 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 that missing, but not getting what is missing, tesseract demo project is working 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.

刚刚将构建设置中的“C ++标准库”更改为“libstdc ++(GNU C ++标准库)”,错误消失了......感谢@ H2CO3提示。

There are several issues:

Firstly ensure the file containing the code:

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

has a file extension of .mm (Objective-C++) as it uses both Objective-C and C++.

Secondly the library looks like it hasn't been compiled for armv7 , so you will need to rebuild it for any architectures you want to support, which will be one or more of armv6 , armv7 , armv7s and i386 (for the iPhone Simulator).

If you are targeting iOS 5.0+ then that will be all of the above apart from armv6 which isn't supported on later versions of Xcode.

Thirdly, make sure you use the same version of C++ and C++ library in both the library and the app, otherwise bad things will happen.

Make sure:

C++ Language Dialect Set "Compiler Default" instead of "GNU++11[-std=gnu++11]"

C++ Standard Library Set "Compiler Default" instead of "libc++(LLVM C++ standard library with C++11 support)"

Also check:

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

and tesseract files should be referenced properly. (drag and drop files not reference properly)

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)
  1. Change Project -> Project -> Build Settings -> **"Enable Bitcode" to NO

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

链接器标志 3. After that install pods by command "pod install"

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM