web-dev-qa-db-fra.com

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

Ce que j'essaye de faire

Intégrer Zxing _, cadre de lecteur de code QR, dans mon projet iPhone. J'ai vérifié ZXing SDK de ici . J'ai exécuté le projet d'exemple venant avec ZXing, nommé ScanTest, sans aucun problème. Mais lorsque j'essaie d'intégrer la bibliothèque à mon projet, l'erreur mentionnée est là.

Cahier des charges

  • OS cible: iOS 6.0
  • Cible de déploiement: iOS 5.0 ou supérieur.
  • Testé sur: iPhone 4 et iPhone 3GS.
  • XCode: Xcode 4.5.1
  • Version ZXing: 2.0

Problème

Quand je construis, après avoir effectué toutes les étapes d'intégration dans fichier readme ZXing , je reçois des erreurs de construction telles que

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 comme ça .. Je n'ai copié que les deux premières. 

Qu'est-ce que j'ai découvert

Eh bien, j'ai traversé ceci _, ceci , ceci , ceci , ceci , ceci , this threads dans stackoverflow, tous avec le même message d'erreur. Aucune des solutions n'a fonctionné pour moi. 

Ensuite, j'ai trouvé ce fil fermé dans les forums ZXing discutant du même problème. De cette discussion, quelques solutions possibles sont (travaillées pour certains)

La première erreur est (probablement) car vous n'avez pas renommé main.m en main.mm. La deuxième erreur est (probablement) parce que vous ne liez pas contre la bibliothèque de widgets

J'ai également renommé mon principal.m, vérifié si j'ai ajouté la bibliothèque pour constater que je l'avais sûrement. Donc ce n'est pas le cas. 

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

Mon architecture de projet, cible, projet de bibliothèque (pour le débogage, la distribution, la publication) est définie sous la forme Standard (armv7, armv7s). Donc pas de chance là-bas non plus. 

Puis ils ont fermé le dossier en disant cela,

Les projets zxing ont été mis à jour pour ajouter l'arc armv7s et supprimer l'arc armv6. Ces modifications sont nécessaires (1) pour construire le fichier iPhone 5 qui est armv7s et (2) à construire du tout puisque Xcode 4.5 fait n'inclut pas le support pour armv6. Si vous avez vos propres fichiers de projet, vous devrez apporter ces modifications vous-même. Ce sont des changements généraux non spécifique à zxing, donc si vous avez des problèmes, vous obtenez get plus/aide plus rapide dans un forum général comme StackOverflow.

Alors me voilà, dans StackOverflow. 

Un point de plus

Dans l'intégration de ZXing fichier README }, la première étape de l'intégration est la suivante:

1) Recherchez le fichier "ZXingWidget.xcodeproj" sous "zxing/iphone/ZXingWidget/". Faites glisser ZXingWidget.xcodeproj et déposez-le sur la racine de la barre latérale "Groupes et fichiers" de votre projet Xcode. UNE Une boîte de dialogue apparaît. Assurez-vous que l'option "Copier les éléments" n'est pas cochée et que "Type de référence" correspond à "Relatif au projet" avant de cliquer sur "Ajouter" . Vous pouvez également cliquer avec le bouton droit de la souris sur votre navigateur de projet et sélectionner "Ajouter des fichiers à" MyProject ".

Lorsque j'ai fait glisser le fichier ZXingWidget.xcodeproj dans mon projet, il n'y avait pas de dialogue. Le projet directement ajouté au projet et je ne pouvais pas définir les propriétés "Copier les éléments" et "Type de référence". Je ne sais pas si c'est une nouvelle fonctionnalité de xcode 4.5 ou un bogue. C’est la seule étape que je ne pouvais pas suivre correctement selon le fichier README. 

Eh bien, vous avez toutes les informations que j'ai avec moi. J'essaie de résoudre ce problème pendant 6 heures. Une idée?

37
Krishnabhadra

Enfin, j'ai enfin réussi à le faire fonctionner. Pour tous ceux qui le rencontreraient dans le futur.

  1. Renommez le fichier main.m en main.mm.

    Le README de ZXing explique pourquoi nous en avons besoin

    Il peut arriver que lorsque vous essayez de construire votre propre projet avec ZXingWidgetController, vous obteniez des erreurs de l'éditeur de liens du type "référence non définie À". Si cette erreur ressemble à une référence c ++ non définie, renommez alors Main.m en principal. .mm (le suffixe source Objective-C++) peut résoudre le problème}

  2. Renommez le fichier (ViewController/View) qui utilise les fonctions ZXing libray Afin qu’il ait également une extension .mm.

  3. Vérifiez les paramètres architecture dans l'ensemble du projet. Indiquez architecture et architecture valide sous la forme armv7 armv7s dans les paramètres de votre projet, les paramètres de cible et le projet ZXing (que vous avez ajouté à votre projet principal) et les paramètres de cible.

  4. Dans projet -> Build Settings, faites défiler et découvrez les options , C++ Language Dialect et C++ Standard Library . Sélectionnez les options "Compilateur Par défaut " pour les deux. (C’est l’étape Que j’ai manquée. C’est nécessaire car le modèle le plus récent de XCode a les paramètres par défaut du compilateur Différents de ce qu’ils étaient dans les anciennes versions ).

  5. Vous devrez peut-être également définir l'indicateur "Build Valid Architecture Only." De ZXingWidget sur NO. Dans mon cas, ce champ était déjà NO

Ceux-ci ont résolu le problème pour moi ..

Mettre à jour

En décembre 2013, Google a retiré le port ZXing iOS/Objective C. Le projet Zxing pour iOS n'est donc plus maintenu et mis à jour pour les nouvelles versions iOS. De plus, Zxing ne prend pas en charge l’architecture Arm64, qui est l’une des architectures standard des nouvelles versions XCode. 

Les développeurs sont donc invités à passer au framework natif d’Apple pour lire le code à barres , disponible à partir d’iOS7. Voir this pour un tutoriel pas à pas.

57
Krishnabhadra

J'ai suivi toutes les suggestions ci-dessus et, bien que tout soit bien compilé, la liaison a échoué:

"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é à partir 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)

etc...

J'utilise Xcode 4.5.2. J'ai renommé main.m en main.mm, mon contrôleur de vue a également été renommé de .m à .mm, l'architecture est partout "armv7 armv7s".

Soupir...

Mettre à jour

Quelqu'un sur les développeurs Apple avait la réponse à mon problème:

Il semble que vous ayez des bibliothèques standard C++ incompatibles. 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 réglez la "Bibliothèque standard C++" sur "libc ++", puis nettoyez tout et reconstruisez.

Si cela ne fonctionne pas, essayez de définir "libstdc ++" sur "Bibliothèque standard C++" dans votre projet et dans ZXingWidget.xcodeproj.

La première suggestion a fait l'affaire.

10
Patrick Gibson

Je l'ai résolu en modifiant une valeur du projet que vous avez fait glisser et déposez dans xcode.

enter image description here

Ensemble:

Construire une architecture active uniquement -> Debug -> No

J'espère que ça aide les gens :)!

6
jimbob

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

enter image description here

6
RawMean

Il peut également être nécessaire de définir le drapeau sur "NON".

4
diadyne

J'ai suivi toutes les suggestions ci-dessus, et bien que tout compile bien mais échoue toujours, 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
riven

J'ai tout répété à plusieurs reprises et après de nombreux essais, il me suffisait de nettoyer mon projet. Cela était nécessaire après avoir modifié le dialecte du langage C++ et la bibliothèque standard C++ en Compiler Default. Quelque chose de simple, je le fais tout le temps mais je l’ai manqué et j'ai perdu 30 minutes.

0
stackdaddy