Undefined symbols for architecture armv7 when using ZXing library in Xcode 4.5

后端 未结 7 1117

What I am trying to do

Integrate Zxing, QR code reader framework, in my iPhone project. I checked out ZXing sdk from here. I ran the sample project coming with ZXi

相关标签:
7条回答
  • 2020-12-07 19:20

    I've followed all of the suggestions above, and while everything compiles fine, the linking fails:

    "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()", referenced from:

      ___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)
    

    and so on...

    I'm running Xcode 4.5.2. I've renamed main.m to main.mm, my view controller was also renamed from .m to .mm, architecture everywhere is "armv7 armv7s".

    Sigh...

    Update

    Someone on the Apple devforums had the answer to my problem:

    It looks like you have mismatched C++ standard libraries. Your project's build settings are using clang's C++ standard library, but libZXingWidget.a was compiled to use the GNU C++ standard library.

    Try this: open ZXingWidget.xcodeproj and set the "C++ Standard Library" to "libc++", then Clean everything and rebuild.

    If that doesn't work, try setting "C++ Standard Library" to "libstdc++" in both your project and ZXingWidget.xcodeproj

    The first suggestion did the trick.

    0 讨论(0)
  • 2020-12-07 19:21

    I've followed all of the suggestions above, and while everything compiles fine, but still fail, the error message:

    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)
    

    so, you add CoreVideo.framework, the compile will be ok.

    0 讨论(0)
  • 2020-12-07 19:23

    I solved it by changing one value on the project you dragged and dropped in to xcode.

    enter image description here

    Set:

    Build Active Architecture Only -> Debug -> No

    Hope that helps people :)!

    0 讨论(0)
  • 2020-12-07 19:29

    I went over everything multiple times and after countless tried it turns out I just needed to Clean my project. This was necessary after changing the C++ Language Dialect and C++ Standard Library to Compiler Default. Something simple I do all the time but I missed it and wasted 30 minutes.

    0 讨论(0)
  • 2020-12-07 19:41

    Well, at last I got it working.. For anyone who encounters this in the future..

    1. Rename the main.m file to main.mm.

      ZXing's README states why we need this

      It can happen that when trying to build your own project with ZXingWidgetController you get linker errors like "undefined reference to". If this error looks like a c++ undefined reference, then renaming main.m into main.mm (Objective-C++ source suffix) may fix the problem

    2. Rename the file (ViewController/View) which uses ZXing libray functions so that it also has .mm extension.

    3. Check architecture settings across project. Give architecture and valid architecture as armv7 armv7s in your project settings, target settings, and ZXing project (which you added to your main project) and target settings.

    4. In main project -> Build Settings scroll and find out the options, C++ Language Dialect and C++ Standard Library. Select options "Compiler Default" for both of them. (This is the step I missed, It is needed because newest XCode template has compiler default settings different to what they were in older versions).

    5. You also might have to set ZXingWidget's "Build Valid Architecture Only" flag set as NO. In my case, this field was already NO

    These fixed the issue for me..

    Update

    On December 2013, Google has retired ZXing iOS/Objective C port. So Zxing project for iOS is no longer maintained and updated for new iOS versions. Also Zxing doesn't have support for Arm64 architecture which is one of the standard architecture as per new XCode versions.

    So developers are encouraged to move over to the native Apple framework to read barcode which is available from iOS7 onwards. See this for a step by step tutorial.

    0 讨论(0)
  • 2020-12-07 19:42

    This solved the problem for me. Nothing else worked.

    enter image description here

    0 讨论(0)
提交回复
热议问题