Подтвердить что ты не робот

Undefined символы для архитектуры armv7 при использовании библиотеки ZXing в XCode 4.5

Что я пытаюсь сделать

Интеграция Zxing, рамки для чтения QR-кода, в моем iPhone-проекте. Я проверил 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 таких ошибок.. Я только скопировал первые два.

Что я узнал

Хорошо, я прошел этот, этот, это, this, this, этот, этот поток в stackoverflow, все с тем же сообщением об ошибке. Ни один из решений не работал у меня.

Затем я нашел этот закрытый поток на форумах 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 "Группы и файлы". появится диалоговое окно - убедитесь, что флажок "Копировать элементы" не установлен и "Тип ссылки" означает "Относительно проекта" перед нажатием "Добавить". Кроме того, вы можете щелкнуть правой кнопкой мыши по навигатору проекта и выбрать 'Добавить файлы в "MyProject" '.

Когда я перетащил файл ZXingWidget.xcodeproj в свой проект, диалога не было. Проект напрямую добавлен в проект, и я не смог установить свойства "копировать элементы" и "Тип ссылки". Я не знаю, что это новая функция xcode 4.5 или ошибка. Это единственный шаг, который я не мог правильно выполнить в соответствии с файлом README.

Хорошо, у вас есть вся информация, которую я имею со мной. Я пытаюсь исправить это в течение 6 часов. Любая идея?

4b9b3361

Ответ 1

Ну, наконец, я получил его работу.. Для тех, кто сталкивается с этим в будущем.

  • Переименуйте файл main.m на main.mm.

    ZXing README заявляет, зачем нам это нужно

    Может случиться так, что при попытке создать собственный проект с помощью ZXingWidgetController вы получите ошибки компоновщика, такие как "undefined reference на". Если эта ошибка выглядит как ссылка С++ undefined, то переименование main.m в main.mm(Objective-C ++ исходный суффикс) может решить проблему

  • Переименуйте файл (ViewController/View), который использует ZXing libray функции, так что он также имеет расширение .mm.

  • Проверьте настройки архитектуры в проекте. Дайте Архитектура и допустимая архитектура как armv7 armv7s в настройках проекта, целевых настройках и проекте ZXing (которые вы добавлен в ваш основной проект) и целевые настройки.

  • В главном проекте Настройки сборки прокрутите и найдите параметры, Диалоговый язык С++ и Стандартная библиотека С++. Выберите опции "Компилятор по умолчанию" для обоих из них. (Это шаг, который я пропустил, Это необходимо, потому что новый шаблон XCode настройки по умолчанию для компилятора, отличные от того, чем они были старше версии).

  • Вам также может потребоваться установить ZXingWidget " Build Valid Architecture Только "установлен как NO. В моем случае это поле уже было NO

Они исправили проблему для меня..

Update

В декабре 2013 года Google вышел на пенсию ZXing iOS/Objective. Поэтому проект Zxing для iOS больше не поддерживается и не обновляется для новых версий iOS. Также Zxing не поддерживает архитектуру Arm64, которая является одной из стандартной архитектуры в соответствии с новыми версиями XCode.

Поэтому разработчикам рекомендуется перейти к родной структуре Apple, чтобы читать штрих-код, который доступен с iOS7 и далее. См. этот для пошагового руководства.

Ответ 2

Я следил за всеми вышеперечисленными предложениями, и, хотя все компилируется нормально, связь не выполняется:

"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".

Вздох...

Update

У кого-то из Apple devforums был ответ на мою проблему:

Похоже, что у вас есть несоответствующие стандартные библиотеки С++. В настройках сборки проекта используется стандартная библиотека clang С++, но libZXingWidget.a был скомпилирован для использования стандартной библиотеки GNU С++.

Попробуйте это: откройте ZXingWidget.xcodeproj и установите "Стандартную библиотеку С++" в "libС++", затем очистите все и перестройте.

Если это не сработает, попробуйте установить "Стандартная библиотека С++" на "libstdС++" в вашем проекте и ZXingWidget.xcodeproj

Первое предложение сделало трюк.

Ответ 3

Я решил это, изменив одно значение в проекте, который вы перетащили и переместили в xcode.

enter image description here

Set:

Только встроенная активная архитектура → Отладка → Нет

Надеюсь, что это поможет людям:)!

Ответ 4

Это решило проблему для меня. Ничего больше не работало.

enter image description here

Ответ 5

Также может потребоваться установить для параметра ZXingWidget значение "Build Active Architecture Only" равным "NO".

Ответ 6

Я следил за всеми приведенными выше предложениями, и хотя все компилируется нормально, но все еще не выполняется, сообщение об ошибке:

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, компиляция будет в порядке.

Ответ 7

Я обошел все несколько раз, и после бесчисленных попыток выяснилось, что мне просто нужно было очистить мой проект. Это было необходимо после изменения языка С++ Language Dialect и стандартной библиотеки С++ для компилятора по умолчанию. Что-то просто я делаю все время, но я пропустил это и потратил 30 минут.