在XCode 4.5中使用ZXing库时,架构armv7的未定义符号

Kri*_*dra 37 cocoa-touch undefined-symbol zxing ios ios6

我想做什么

在我的iPhone项目中集成Zxing,QR码阅读器框架.我从这里检查了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> > >
Run Code Online (Sandbox Code Playgroud)

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

我发现了什么

好吧,我经历了这个,这个,这个,这个,这个,这个,这个线程计算器,都具有相同的错误消息.这些解决方案都不适合我.

然后我在ZXing论坛中发现这个封闭的线程讨论同样的问题.从讨论中,一些可能的解决方案(为某些人工作)

第一个错误(可能)是因为您没有将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文件中,集成的第一步是,

1)找到""下的"ZXingWidget.xcodeproj"文件zxing/iphone/ZXingWidget/.拖动ZXingWidget.xcodeproj并将其拖放到Xcode项目的"Groups and Files"侧栏的根目录中.将出现一个对话框 - 确保未选中"复制项目",并在单击"添加"之前将"参考类型"设置为"相对于项目".或者,您可以右键单击项目导航器,然后选择"将文件添加到"MyProject"'.

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

好吧,你掌握了我的所有信息.我试图解决这个问题6个小时.任何的想法?

Kri*_*dra 57

好吧,最后我得到了它的工作..对于任何在未来遇到这个的人..

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

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

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

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

  3. 检查整个项目的架构设置.给 建筑有效的架构ARMv7的armv7s在您的项目设置,目标设置,以及斑马线项目(您添加到您的主项目)和目标设置.

  4. 在主项目 - > 构建设置中滚动并找出选项,C++语言方言C++标准库.为它们选择"编译器默认值"选项.(这是我错过的步骤,因为最新的XCode模板的编译器默认设置与旧版本不同,所以需要它.

  5. 您还可能必须将ZXingWidget的" 仅构建有效体系结构 "标志设置为NO.就我而言,这个领域已经存在NO

这些解决了我的问题..

更新

2013年12月,谷歌退出了ZXing iOS/Objective C端口.因此,不再为新的iOS版本维护和更新适用于iOS的Zxing项目.Zxing也不支持Arm64架构,这是新XCode版本的标准架构之一.

因此,鼓励开发人员转移到本机Apple框架以读取从iOS7开始提供的条形码.请参阅步骤以获取分步教程.

  • (4)是通过cocoapods将ZXing添加到新创建的XCode 4.5.2项目时的神奇修复. (2认同)

Pat*_*son 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)
Run Code Online (Sandbox Code Playgroud)

..."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)
Run Code Online (Sandbox Code Playgroud)

等等...

我正在运行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 ++"

第一个建议就是诀窍.


jim*_*bob 6

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

在此输入图像描述

组:

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

希望能帮助人:)!


Raw*_*ean 6

这解决了我的问题.没有其他工作.

在此输入图像描述


归档时间:

查看次数:

27899 次

最近记录:

10 年,11 月 前