【问题标题】:Errors in Tesseract integration in iOS appiOS 应用程序中的 Tesseract 集成错误
【发布时间】:2015-12-01 22:24:26
【问题描述】:

在我的 iOS 应用程序中集成 Tesseract SDK 时遇到一些错误。 我遵循的程序 -

1) 在 xcode 中拖动“libtesseract_full.a” 2)在xcode中拖动“tessdata”文件夹 3)在xcode中拖动“baseapi.h”

现在当我使用 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);

我收到以下错误(我认为缺少一些框架或类似的东西,但没有得到缺少的东西,tesseract 演示项目在我的系统上运行良好)

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)

任何帮助将不胜感激。

【问题讨论】:

  • 未链接 C++ 标准库。
  • 我在其他链接器标志中添加了“-stdc++”和“-ObjC”。
  • 应该是-lstdc++
  • 刚刚添加了“-lstdc++”,但它不起作用..
  • 刚刚将构建设置中的“C++ 标准库”更改为“libstdc++(GNU C++ 标准库)并且错误消失了……谢谢 H2CO3……爱你!

标签: iphone ios tesseract


【解决方案1】:

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

【讨论】:

  • 非常感谢,提供单线解决方案
【解决方案2】:

有几个问题:

首先确保包含代码的文件:

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

文件扩展名为.mm (Objective-C++),因为它同时使用了 Objective-C 和 C++。

其次,该库看起来还没有为armv7 编译,因此您需要为您想要支持的任何架构重新构建它,这将是armv6armv7、@ 中的一个或多个987654326@ 和 i386(用于 iPhone 模拟器)。

如果您的目标是 iOS 5.0+,那么除了 armv6 之外的所有内容都将在更高版本的 Xcode 上不受支持。

第三,确保在库和应用程序中使用相同版本的 C++ 和 C++ 库,否则会发生不好的事情。

【讨论】:

  • 刚刚将构建设置中的“C++ 标准库”更改为“libstdc++(GNU C++ 标准库)并且错误消失了……谢谢@H2CO3
【解决方案3】:

确保:

C++ 语言方言设置“编译器默认值”而不是“GNU++11[-std=gnu++11]”

C++ 标准库设置“编译器默认”而不是“libc++(支持 C++11 的 LLVM C++ 标准库)”

同时检查:

C 语言方言集“C00 [-std=c99]”而不是“GNU00 [-std=gnu99]”

并且应该正确引用 tesseract 文件。 (拖放文件引用不正确)

【讨论】:

    【解决方案4】:
    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. 更改项目 -> 项目 -> 构建设置 -> **“启用位码” 否

    2. 同时删除“链接”->“其他链接器标志”中的所有链接器标志 并添加这个

    3. 之后通过命令“pod install”安装 pods

    它适用于 Swift 2 和 Xcode 7.2(测试版)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-06
      • 2011-06-30
      • 2016-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多