Symboles non définis pour l'architecture armv7 lors de L'utilisation de la bibliothèque ZXing dans Xcode 4.5

ce que j'essaie de faire

Intégrer Zxing , lecteur de QR code le cadre de mon iPhone projet. J'ai vérifié ZXing sdk de ici . J'ai lancé le projet avec ZXing, nommé ScanTest, sans aucun problème. Mais quand j'essaie d'intégrer la bibliothèque avec mon projet, je reçois l'erreur mentionnée.

cahier des charges

  • Cible OS : iOS 6.0
  • objectif de déploiement : iOS 5.0 ou plus.
  • testé sur : iPhone 4 et iPhone 3GS.
  • XCode : Xcode 4.5.1
  • ZXing version : 2.0

problème

quand je construis, après avoir fait toutes les étapes d'intégration dans ZXing readme file , je reçois des erreurs de construction comme

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

il y a 27 erreurs de ce genre.. J'ai seulement copié les deux premiers.

Qu'ai-je découvert

eh Bien, je suis passé par ce , ce , ce , ce , ce , ce , ce threads dans stackoverflow, tous avec le même message d'erreur. Aucune des solutions n'a fonctionné pour moi.

puis j'ai trouvé ce fil fermé dans les forums de ZXing discutant de la même question. De cette discussion, quelques solutions possibles sont (travaillé pour certains)

la première erreur est (probablement) parce que vous n'avez pas renommé main.m à main.mmm. La deuxième erreur est (probablement) parce que vous n'êtes pas lier contre la bibliothèque de widget

j'ai aussi renommé mon principal.m, j'ai vérifié si j'ai ajouté la bibliothèque seulement pour trouver que j'avais sûrement. Donc, ce n'est pas le cas.

après que j'ai changé le Architectures de la bibliothèque à "Standard (armv7, armv7s)" pour correspondre à mon projet principal j'ai pu réussir à compiler l'application.

My projet, cible, projet de bibliothèque (pour le débogage, la distribution, la publication) l'architecture est donnée comme Standard (armv7, armv7s) . Donc pas de chance non plus.

puis ils ont clos le numéro en disant ceci,

les projets zxing ont été mis à jour pour ajouter l'Arc armv7s et enlever l'Arc armv6. Ces modifications sont nécessaires (1) pour construire iPhone 5 qui est armv7s et (2) à construire du tout depuis Xcode 4.5 ne ne comprend pas le support pour armv6. Si vous avez vos propres dossiers de projet, vous devrez faire ces changements vous-même. Ce sont en général des changements pas spécifique à zxing donc si vous avez des problèmes, vous faire obtenir aide plus / plus rapide dans un forum général comme StackOverflow.

alors me voilà, dans StackOverflow.

un point de plus

Dans ZXing intégration fichier LISEZMOI , la première étape dans l'intégration est,

1) Localisez le" ZXingWidget.xcodeproj" fichier " zxing/iphone/ZXingWidget/ ". Faites Glisser ZXingWidget.xcodeproj et le laisser tomber à la racine de la barre latérale "Groups and Files" de votre projet Xcode. Un boîte de dialogue apparaîtra -- assurez-vous que "Copier" n'est pas cochée et "Type de référence "est" relatif au projet "avant de cliquer sur"Ajouter". Alternativement, vous pouvez cliquer droit sur votre projet de navigation et sélectionnez 'Ajouter des fichiers à"MyProject"'.

quand j'ai traîné le ZXingWidget.xcodeproj fichier de mon projet, il n'y avait pas de dialogue. Le projet a directement ajouté au projet et je n'ai pas pu définir les propriétés" copier des éléments "et" type de référence". Je ne sais pas, c'est une nouvelle fonctionnalité de xcode 4.5 ou un bug. C'est la seule étape que je n'ai pas pu suivre correctement selon le fichier README.

eh Bien, vous avez toutes les informations que j'ai avec moi. J'essaie de réparer ça pendant 6 heures. Une idée?

37
demandé sur Community 2012-10-19 10:15:00

7 réponses

enfin, je l'ai fait marcher.. Pour tous ceux qui rencontreront cela dans le futur..

  1. Renommer le principal.m file à main.mmm.

    ZXING's README explique pourquoi nous en avons besoin

    il peut arriver que lorsque vous essayez de construire votre propre projet avec ZXingWidgetController vous obtenez des erreurs de linker comme " référence non définie de." Si cette erreur ressemble à une référence non définie c++ , puis renommer principal.m dans la principale.mm (Objective-C++ source suffixe) peut résoudre le problème

  2. renommer le fichier (ViewController / View) qui utilise ZXing libray fonctions de sorte qu'il a également.mm extension.

  3. vérifier architecture paramètres du projet. Donner architecture et valide "l'architecture 1519240920" comme armv7 armv7s dans vos paramètres de projet, les paramètres de cible ,et le projet ZXing (que vous ajouté à votre projet principal) et les paramètres cibles.

  4. En main projet -> Build Settings de défilement et de trouver la options, Langage C++ "Dialecte de 1519240920" et C++ Standard Library . Sélectionner les options " compilateur par défaut" pour les deux. (C'est le étape que j'ai manquée, il est nécessaire parce que le plus récent modèle XCode a compilateur par défaut des paramètres différents de ce qu'ils étaient dans les anciens version.)

  5. vous pourriez aussi avoir à définir L'Architecture valide de construction de ZXingWidget " Seulement " drapeau placé comme NO . Dans mon cas, ce champ était déjà NO

Ces résolu le problème pour moi..

mise à Jour

Le décembre 2013, Google a retiré ZXing iOS/objectif C port. Ainsi Zxing project for iOS n'est plus maintenu et mis à jour pour les nouvelles versions d'iOS. De plus, Zxing ne prend pas en charge L'architecture Arm64, qui est l'une des architectures standard selon les nouvelles versions de XCode.

donc les développeurs sont encouragés à passer à la Apple natif cadre pour lire le code à barres qui est disponible à partir de iOS7. Voir ce pour un tutoriel étape par étape.

57
répondu Krishnabhadra 2014-10-09 11:27:07

j'ai suivi toutes les suggestions ci-dessus, et pendant que tout se compile bien, le lien échoue:

"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 ()", référencé de:

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

et ainsi de suite...

j'exécute Xcode 4.5.2. J'ai renommé principal.m à main.mm, mon contrôleur de vue a aussi été renommé de .m to .l'architecture est partout "armv7 armv7s".

soupir...

mise à Jour

Quelqu'un sur le Apple devforum avait la réponse à mon problème:

on dirait que vous avez mal comparé les bibliothèques C++ standard. Les paramètres de construction de votre projet utilisent la bibliothèque standard C++ de clang, mais libZXingWidget.a a été compilé pour utiliser la bibliothèque standard GNU C++.

essayez ceci: ouvrez ZXingWidget.xcodeproj et définir la " bibliothèque Standard C++" à " libc++", puis Tout nettoyer et reconstruire.

si cela ne fonctionne pas, essayez de configurer" bibliothèque Standard C++ "en" libstdc++ " dans votre projet et ZXingWidget.xcodeproj

la première suggestion fit l'affaire.

10
répondu Patrick Gibson 2012-12-10 19:44:44

je l'ai résolu en changeant une valeur sur le projet que vous glissés et déposés dans xcode.

enter image description here

Set:

Construire Active Seulement L'Architecture -> Debug -> Pas De

l'Espoir qui aide les gens :)!

6
répondu jimbob 2012-12-27 17:21:22

Cela a résolu le problème pour moi. Rien d'autre n'a fonctionné.

enter image description here

6
répondu RawMean 2014-05-04 00:26:40

il peut également être nécessaire de définir le drapeau" Build Active Architecture Only "de la cible ZXingWidget à"NO".

4
répondu diadyne 2012-10-25 21:29:10

j'ai suivi toutes les suggestions ci-dessus, et pendant que tout se compile bien, mais échouent encore, le message d'erreur:

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)

donc, vous ajoutez CoreVideo.framework, la compilation sera ok.

1
répondu riven 2013-08-19 09:10:11

j'ai tout passé en revue plusieurs fois et après d'innombrables essais, il s'avère que j'avais juste besoin de nettoyer mon projet. Cela a été nécessaire après avoir changé le dialecte du langage C++ et la bibliothèque Standard C++ en compilateur par défaut. Quelque chose de simple que je fais tout le temps mais je l'ai manqué et perdu 30 minutes.

0
répondu stackdaddy 2013-04-03 19:16:30