Xcode 4.6、iOS SDK 6.1、tesseract-ocr 3.02
由于最后的 OpenCV 版本是使用libc++构建的,而 tesseract-ocr 是使用libstdc++构建的,因此它们不能在一个 xcode 项目中一起使用。
所以,我正在尝试使用 libc++ 构建 tesseract。使用此处的脚本(将基本 sdk 和部署目标更新到 6.1),tesseract 构建得很好,一旦 C++ 标准库设置为编译器默认值,它就可以在我的 xcode 项目中工作。然后,根据此处的答案,我尝试更改脚本以使用 libc++ 构建它。我将CXX更改为指向clang++,并将-stdlib=libc++添加到CXXFLAGS。
结果是脚本成功,并且构建了库,但是当在 xcode 中选择 libc++ 作为 C++ 标准库时,我收到很多链接器错误并且项目构建失败。当标准库设置为编译器默认值时(就像定期构建时一样),新库仍然有效。
我错过了什么?
2 回答
好的,所以我的问题是,在我的项目中多次添加和删除对库的引用后,我的库搜索路径非常混乱。另外,我没有将新的“包含”文件夹(在构建 tesseract 时创建)添加到用户标题搜索路径中。
因此,简单回顾一下,为了使用 libc++ 构建 tesseract-ocr,它可以与较新的 OpenCV 版本一起使用:
- 下载 leptonica-1.69
- 下载 tesseract 3.02
- 将它们排列在原始教程中解释的文件夹结构中
- 将此脚本下载到同一文件夹。
- 为您的相关 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
非常感谢这个答案,这让我一路走好。
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。