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.
There are several issues:
Firstly ensure the file containing the code:
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 ofarmv6
,armv7
,armv7s
andi386
(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.
Change Project -> Project -> Build Settings -> **"Enable Bitcode" to NO
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)
just changed "C++ Standard Library" in build settings to "libstdc++ (GNU C++ standard library)" and errors are gone… Thanks @H2CO3 for hint.
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)