在Xcode 4.5中使用ZXing库时,体系结构armv7的未定义符号

问题描述 投票:37回答:7

我想做什么

在我的iPhone项目中集成Zxing,QR码阅读器框架。我从here中签出了ZXing SDK。我运行了ZXing附带的示例项目,名为ScanTest,没有任何问题。但是,当我尝试将库与我的项目集成时,出现了错误提示。

项目规格

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

问题

构建时,在完成ZXing readme file中的每个集成步骤后,我遇到诸如以下的构建错误

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中的thisthisthisthisthisthisthis线程,所有线程都具有相同的错误消息。没有一种解决方案对我有用。

然后我在ZXing论坛中发现this closed thread,讨论了同一问题。通过该讨论,找到了一些可能的解决方案(适用于某些情况)

第一个错误是(可能是),因为您尚未将main.m重命名为main.mm。第二个错误是(可能是)因为您未链接针对小部件库

我还重命名了main.m,进行交叉检查,是否仅是确定我确实拥有才添加了库。所以事实并非如此。

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

我的项目,目标,库项目(用于调试,分发,发布)的体系结构以Standard (armv7, armv7s)给出。所以那里也没有运气。

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

zxing项目已更新,以添加armv7s拱门并删除armv6拱门。这些更改是必需的(1),以便为iPhone 5是armv7s,而(2)由于Xcode 4.5完全可以构建不包括对armv6的支持。如果您有自己的项目文件,您需要自己进行这些更改。这些是一般更改不特定于zxing,所以如果遇到麻烦,您会得到在一般论坛(如StackOverflow)中获得更多/快速帮助。

所以我在StackOverflow中。

多一点

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

1]在“ zxing/iphone/ZXingWidget/”下找到“ ZXingWidget.xcodeproj”文件。拖放ZXingWidget.xcodeproj到Xcode项目的“组和文件”侧栏的根目录上。一种对话框将会出现-确保未选中“复制项目”,在单击“添加”之前,“引用类型”是“相对于项目”。或者,您可以右键单击项目导航器,然后选择“将文件添加到“ MyProject””。

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

嗯,您拥有了我所有的信息。我已经尝试修复了6个小时。有什么主意吗?

ios cocoa-touch ios6 zxing undefined-symbol
7个回答
57
投票

嗯,终于让它开始工作了。对于将来遇到这个问题的人。

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

    ZXing的自述文件说明了我们为什么需要这个

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

  2. 重命名使用ZXing libray的文件(ViewController / View)功能,使其扩展名为.mm。

  3. 检查体系结构整个项目的设置。给在项目设置,目标设置和ZXing项目(您可以在其中将体系结构有效体系结构用作armv7 armv7s)添加到您的主项目)和目标设置。

  4. 在主项目-> 构建设置滚动并找出选项C ++语言方言C ++标准库。为它们两个都选择选项“ Compiler Default”。 (这是我错过的步骤,这是必需的,因为最新的XCode模板具有编译器默认设置与以前的设置不同版本)。

  5. 您可能还需要设置ZXingWidget的“ “标志设置为NO。对于我来说,此字段已经是NO

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

更新

2013年12月,Google has retired ZXing iOS/Objective C端口。因此,不再为新的iOS版本维护和更新iOS版Zxing项目。同样,Zxing不支持Arm64体系结构,这是新XCode版本的标准体系结构之一。

因此,鼓励开发人员转到iOS7以后的native Apple framework to read barcode。请参见this以获取分步教程。


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 devforum上的某人回答了我的问题:

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

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

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

第一个建议成功了。


6
投票

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

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9lc0FTVS5wbmcifQ==” alt =“在此处输入图像描述”>

设置:

仅构建活动体系结构->调试->否

希望能帮助人们的:)!


6
投票

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

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9oajVWeS5wbmcifQ==” alt =“在此处输入图像描述”>


4
投票

可能还需要将ZXingWidget目标的“仅构建活动架构”标志设置为“否”。


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,编译就可以了。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.