37

我想要做什么

在我的 iPhone 项目中集成Zxing二维码阅读器框架。我从这里查看了 ZXing sdk 。我运行了 ZXing 附带的名为 ScanTest 的示例项目,没有任何问题。但是当我尝试将库与我的项目集成时,我得到了提到的错误。

项目规范

  • 目标操作系统:iOS 6.0
  • 部署目标:iOS 5.0 或以上。
  • 测试:iPhone 4 和 iPhone 3GS。
  • Xcode:Xcode 4.5.1
  • ZXing版本:2.0

问题

当我构建时,在ZXing 自述文件中执行了每个集成步骤后,我都会遇到构建错误,例如

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:
      zxing::qrcode::Detector::computeDimension(zxing::Ref<zxing::ResultPoint>, zxing::Ref<zxing::ResultPoint>, zxing::Ref<zxing::ResultPoint>, float) in libZXingWidget.a(Detector-B8B28E953F840D47.o)

Undefined symbols for architecture armv7:
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)", referenced from:
      zxing::Exception::Exception(char const*) in libZXingWidget.a(Exception.o)
      zxing::common::StringUtils::guessEncoding(unsigned char*, int, std::map<unsigned int, std::string, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, std::string> > >

有27个这样的错误..我只复制了前两个。

我发现了什么

好吧,我经历了这个这个这个这个,这个,这个这个这个stackoverflow中的线程,都带有相同的错误消息。没有一个解决方案对我有用。

然后我在 ZXing 论坛上发现了这个封闭的帖子,讨论了同样的问题。从那次讨论中,一些可能的解决方案(对某些人有效)

第一个错误是(可能)因为您没有将 main.m 重命名为 main.mm。第二个错误是(可能)因为您没有链接到小部件库

我还重命名了我的 main.m,交叉检查了我是否添加了库,只是发现我确实有。所以事实并非如此。

在我将库的体系结构更改为“标准(armv7,armv7s)”以匹配我的主要项目后,我能够成功编译应用程序。

我的项目、目标、库项目(用于调试、分发、发布)架构为Standard (armv7, armv7s). 所以那里也没有运气。

然后他们关闭了这个问题,

zxing 项目已更新为添加 armv7s 架构并删除 armv6 架构。这些更改是 (1) 为 armv7s 的 iPhone 5 构建和 (2) 构建所必需的,因为 Xcode 4.5 不包括对 armv6 的支持。如果您有自己的项目文件,则需要自己进行这些更改。这些是并非特定于 zxing 的一般更改,因此如果您遇到问题,您可以在 StackOverflow 等一般论坛中获得更多/更快的帮助。

所以我在这里,在 StackOverflow 中。

还有一点

在 ZXing 集成README 文件中,集成的第一步是,

1) 在“ ”下找到“ZXingWidget.xcodeproj”文件zxing/iphone/ZXingWidget/。将 ZXingWidget.xcodeproj 拖放到 Xcode 项目的“组和文件”侧边栏的根目录下。将出现一个对话框——确保在单击“添加”之前未选中“复制项目”并且“参考类型”为“相对于项目”。或者,您可以右键单击项目导航器并选择“将文件添加到“MyProject””。

当我将 ZXingWidget.xcodeproj 文件拖到我的项目中时,没有对话框。该项目直接添加到项目中,我无法设置“复制项目”和“引用类型”属性。不知道是Xcode 4.5的新特性还是bug。根据 README 文件,这是我无法正确遵循的唯一步骤。

好吧,你拥有我所拥有的所有信息。我一直试图解决这个问题 6 个小时。任何的想法?

4

7 回答 7

57

好吧,最后我让它工作了..对于将来遇到这种情况的任何人..

  1. 将 main.m 文件重命名为 main.mm。

    ZXing 的 README 说明了我们为什么需要这个

    尝试使用 ZXingWidgetController 构建自己的项目时,可能会出现链接器错误,例如“未定义的引用”。如果此错误看起来像 c++ 未定义引用,则将 main.m 重命名为 main.mm(Objective-C++ 源代码后缀)可能会解决问题

  2. 重命名使用 ZXing libray 函数的文件(ViewController/View),使其也具有 .mm 扩展名。

  3. 检查整个项目的架构设置。在您的项目设置、目标设置和 ZXing 项目(您添加到主项目中)和目标设置中,将架构有效架构作为armv7 armv7s提供。

  4. 在 main project -> Build Settings滚动并找出选项C++ Language DialectC++ Standard Library。为它们选择“编译器默认值”选项。(这是我错过的步骤,它是必需的,因为最新的 XCode 模板具有与旧版本不同的编译器默认设置)。

  5. 您可能还必须将 ZXingWidget 的“仅构建有效架构”标志设置为NO. 就我而言,这个领域已经NO

这些为我解决了这个问题..

更新

2013 年 12 月,Google 已停用 ZXing iOS/Objective C 端口。因此,iOS 的 Zxing 项目不再针对新的 iOS 版本进行维护和更新。此外,Zxing 不支持 Arm64 架构,这是新 XCode 版本的标准架构之一。

因此,鼓励开发人员转移到原生 Apple 框架来读取从 iOS7 开始提供的条形码。有关分步教程,请参阅此内容。

于 2012-10-19T08:20:24.007 回答
10

我已经遵循了上面的所有建议,虽然一切都编译得很好,但链接失败了:

"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:
  zxing::qrcode::Detector::computeDimension(zxing::Ref<zxing::ResultPoint>, zxing::Ref<zxing::ResultPoint>, zxing::Ref<zxing::ResultPoint>, float) in libZXingWidget.a(Detector-B8B28E953F840D47.o)
  zxing::GridSampler::checkAndNudgePoints(zxing::Ref<zxing::BitMatrix>, std::vector<float, std::allocator<float> >&) in libZXingWidget.a(GridSampler.o)
  zxing::qrcode::DecodedBitStreamParser::decodeNumericSegment(zxing::Ref<zxing::BitSource>, std::string&, int) in libZXingWidget.a(DecodedBitStreamParser-64E27B33E79CBC52.o)
  zxing::qrcode::Mode::forBits(int) in libZXingWidget.a(Mode.o)

...“std::ios_base::Init::Init()”,引用自:

  ___cxx_global_var_init in libZXingWidget.a(QRCodeReader-F470BE6889D3F76D.o)
  ___cxx_global_var_init in libZXingWidget.a(Decoder-3DF771F40A970F8E.o)
  ___cxx_global_var_init in libZXingWidget.a(FormatReader.o)
  ___cxx_global_var_init in libZXingWidget.a(QRCodeReader-C190599C861BFE46.o)
  ___cxx_global_var_init in libZXingWidget.a(DecodeHints.o)
  ___cxx_global_var_init in libZXingWidget.a(BinaryBitmap.o)
  ___cxx_global_var_init in libZXingWidget.a(DecoderResult.o)

等等...

我正在运行 Xcode 4.5.2。我已将 main.m 重命名为 main.mm,我的视图控制器也从 .m 重命名为 .mm,架构处处都是“armv7 armv7s”。

叹...

更新

Apple devforums 上的某个人回答了我的问题:

看起来您的 C++ 标准库不匹配。您的项目的构建设置使用 clang 的 C++ 标准库,但 libZXingWidget.a 被编译为使用 GNU C++ 标准库。

试试这个:打开 ZXingWidget.xcodeproj 并将“C++ 标准库”设置为“libc++”,然后清理所有内容并重建。

如果这不起作用,请尝试在您的项目和 ZXingWidget.xcodeproj 中将“C++ 标准库”设置为“libstdc++”

第一个建议成功了。

于 2012-12-07T00:15:47.897 回答
6

我通过更改您拖放到 xcode 的项目上的一个值来解决它。

在此处输入图像描述

放:

仅构建活动架构 -> 调试 -> 否

希望对人们有所帮助:)!

于 2012-12-27T17:21:22.967 回答
6

这为我解决了这个问题。没有其他工作。

在此处输入图像描述

于 2014-05-04T00:26:40.063 回答
4

可能还需要将 ZXingWidget 目标的“Build Active Architecture Only”标志设置为“NO”。

于 2012-10-25T21:29:10.313 回答
1

我已经遵循了上面的所有建议,虽然一切都编译得很好,但仍然失败,错误消息:

Undefined symbols for architecture armv7:
"_CVPixelBufferLockBaseAddress", referenced from:-[ZXingWidgetController captureOutput:didOutputSampleBuffer:fromConnection:] in libZXingWidget.a(ZXingWidgetController.o)
"_CVPixelBufferGetBytesPerRow", referenced from:-[ZXingWidgetController captureOutput:didOutputSampleBuffer:fromConnection:] in libZXingWidget.a(ZXingWidgetController.o)
"_CVPixelBufferGetWidth", referenced from:-[ZXingWidgetController captureOutput:didOutputSampleBuffer:fromConnection:] in libZXingWidget.a(ZXingWidgetController.o)
"_CVPixelBufferGetBaseAddress", referenced from:-[ZXingWidgetController captureOutput:didOutputSampleBuffer:fromConnection:] in libZXingWidget.a(ZXingWidgetController.o)
"_kCVPixelBufferPixelFormatTypeKey", referenced from:-[ZXingWidgetController initCapture] in libZXingWidget.a(ZXingWidgetController.o)
"_CVPixelBufferGetHeight", referenced from:-[ZXingWidgetController captureOutput:didOutputSampleBuffer:fromConnection:] in libZXingWidget.a(ZXingWidgetController.o)
"_CVPixelBufferUnlockBaseAddress", referenced from:-[ZXingWidgetController captureOutput:didOutputSampleBuffer:fromConnection:] in libZXingWidget.a(ZXingWidgetController.o)ld: symbol(s) not found for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation)

所以,你添加CoreVideo.framework,编译就OK了。

于 2013-08-19T09:10:11.643 回答
0

我多次检查所有内容,经过无数次尝试,结果发现我只需要清理我的项目。在将 C++ 语言方言和 C++ 标准库更改为编译器默认值后,这是必要的。我一直在做一些简单的事情,但我错过了,浪费了 30 分钟。

于 2013-04-03T19:16:30.997 回答