【问题标题】:Tesseract-OCR 3.02 with libc++带有 libc++ 的 Tesseract-OCR 3.02
【发布时间】:2013-04-25 18:08:39
【问题描述】:

Xcode 4.6、iOS SDK 6.1、tesseract-ocr 3.02

由于最后的 OpenCV 版本是使用 libc++ 构建的,而 tesseract-ocr 是使用 libstdc++ 构建的,因此它们不能在一个 xcode 项目中一起使用。
所以,我正在尝试使用 libc++ 构建 tesseract。使用脚本here(将基本 sdk 和部署目标更新到 6.1),tesseract 构建得很好,一旦 C++ 标准库设置为编译器默认值,它就可以在我的 xcode 项目中工作。然后,根据答案here,我尝试更改脚本以使用 libc++ 构建它。我将 CXX 更改为指向 clang++,并将 -stdlib=libc++ 添加到 CXXFLAGS
结果是脚本成功,并且构建了库,但是当在 xcode 中选择 libc++ 作为 C++ 标准库时,我收到很多链接器错误并且项目构建失败。当标准库设置为编译器默认值时,新库仍然有效(就像定期构建时一样)。

我错过了什么?

【问题讨论】:

  • 什么是第一个链接错误?
  • 感谢您的回复。 “架构 armv7s 的未定义符号”,以及整个库中引用的大量“std::....”。我的有效架构设置为 armv7 和 armv7s,“仅构建活动架构”设置为“否”。
  • 小更新:IOS_DEPLOY_TGFT 与我在 xcode 项目中使用的不同。纠正它仍然会产生相同的错误,但现在它是“armv7”而不是“armv7s”。我似乎无法弄清楚这一点。

标签: ios opencv tesseract libc++


【解决方案1】:

好的,所以我的问题是,在我的项目中多次添加和删除对库的引用后,我的库搜索路径非常混乱。另外,我没有将新的“包含”文件夹(在构建 tesseract 时创建)添加到用户标题搜索路径。

所以,简单回顾一下,为了使用 libc++ 构建 tesseract-ocr,以便它可以与较新的 OpenCV 版本一起使用:

  • 下载 leptonica-1.69
  • 下载tesseract 3.02
  • 将它们排列在原教程here中解释的文件夹结构中
  • this 脚本下载到同一文件夹。
  • 为您的相关 IOS_BASE_SDK 和 IOS_DEPLOY_TGT 编辑脚本。
  • 编辑 CXX 以使用 clang++:CXX="/usr/bin/clang++"
  • 编辑 CXXFLAGS 以使用 libc++ 作为标准库:CXXFLAGS="$CFLAGS -stdlib=libc++"
  • 使用脚本构建 tesseract 和 leptonica。
  • 将这些库添加到您的 xcode 项目中,将“C++ 标准库”设置更改为 libc++。
  • 确保您的“库搜索路径”设置未指向任何旧的 tesseract 库。
  • 确保您的“用户标头搜索路径”设置指向您在构建新库时创建的新“包含”文件夹。
  • 现在,当您尝试构建项目时,您会丢失一些头文件。只需从 tesseract 和 leptonica 的旧“包含”文件夹中复制它们即可。

就是这样。此时,您将拥有一个能够同时使用新 OpenCV 版本和 tesseract 3.02 的项目。如果它是一个新项目,请不要忘记相应地编辑您的前缀文件以包含 OpenCV 和 Tesseract 以防 __cplusplus,并将使用它们的任何 .m 文件重命名为 .mm

非常感谢this 的回答,这让我一路走好。

【讨论】:

  • 你能分享一下编译好的库吗?构建它时遇到问题。
  • 按照你说的做了,修复了很多错误,除了这个:检查C编译器是否工作......没有。有什么想法吗?
  • 其实我在构建过程中并没有检查是否所有的测试都通过了。图书馆根本就没有建吗?
  • 好。由于某种原因,它不会复制所有头文件。只需查看它没有找到哪些文件,然后从下载的文件中手动复制它们。这应该足以让您使用创建的库。
  • @bagusflyer 如果您不需要 Tesseract 在同一个项目中与 OpenCV 一起工作,则无需使用 libc++ 构建它。在这种情况下,您可以定期构建 tesseract,或者只是找到一个预编译版本,这样可以省去您的麻烦。
【解决方案2】:

Tsseract-OCR-iOS 已更新以处理此问题(在与 libc++ 编译项目(例如 OpenCV)相同的项目中工作)。安装时不要忘记这些步骤:

如果您使用的是 iOS7 或更高版本,请链接 libstdc++.6.0.9.dylib 库(您的目标 => 常规 => 链接的框架和库 => + => libstdc++.6.0.9)

转到您的项目,单击该项目,然后在 Build Settings 选项卡中将 -lstdc++ 添加到所有“Other Linker Flags”键。

*转到您的项目设置,并确保 C++ 标准库 => 编译器默认值。 (感谢https://github.com/trein

从项目根目录下的模板框架项目中复制并导入 tessdata 文件夹。它包含“tessdata”文件。您可以在此处添加更多的 tessdata 文件复制它们。

*我必须将 C++ 标准库设置为“libc++”才能编译 OpenCV。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多