37 votes

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 Le framework de lecture de code QR, dans mon projet iPhone. J'ai consulté le sdk ZXing de aquí . J'ai exécuté le projet d'exemple fourni avec ZXing, nommé ScanTest, sans aucun problème. Mais lorsque j'essaie d'intégrer la bibliothèque à mon projet, j'obtiens l'erreur mentionnée.

Spécification du projet

  • Système d'exploitation 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

Lorsque je construis, après avoir effectué toutes les étapes d'intégration dans Fichier readme de ZXing J'obtiens 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 de ce type. Je n'ai copié que les deux premières.

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

Eh bien, je suis passé par este , este , este , este , este , este , este 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 de discussion fermé dans les forums de ZXing discutant du même problème. D'après cette discussion, voici quelques solutions possibles (qui ont fonctionné pour certains)

La première erreur est (probablement) due au fait que vous n'avez pas renommé main.m en main.mm. La deuxième erreur est (probablement) due au fait que vous n'établissez pas de lien avec la bibliothèque de widgets

J'ai également renommé mon main.m, j'ai vérifié si j'avais ajouté la bibliothèque et j'ai constaté que je l'avais fait. Ce n'est donc pas le cas.

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

L'architecture de mon projet, de ma cible et de ma bibliothèque (pour le débogage, la distribution et la mise en production) est la suivante Standard (armv7, armv7s) . Il n'y a donc pas de chance de ce côté-là non plus.

Ils ont ensuite clôturé le dossier en disant ceci,

Les projets zxing ont été mis à jour pour ajouter l'archive armv7s et supprimer l'archive armv6. Ces changements sont nécessaires (1) pour construire pour le iPhone 5 qui est armv7s et (2) pour construire tout court puisque Xcode 4.5 ne pas de support pour armv6. Si vous avez vos propres fichiers de projet, vous devrez faire ces changements vous-même. Ce sont des changements généraux pas spécifiques à zxing, donc si vous avez des problèmes, vous obtiendrez plus d'aide dans un forum général comme StackOverflow.

Me voici donc sur StackOverflow.

Encore un point

Dans l'intégration de ZXing Fichier README La première étape de l'intégration est la suivante,

1) Localisez le fichier "ZXingWidget.xcodeproj" sous " zxing/iphone/ZXingWidget/ ". Faites glisser ZXingWidget.xcodeproj et déposez-le à la racine de la barre latérale "Groupes et fichiers" de votre projet Xcode. A s'affiche -- assurez-vous que "Copy items" n'est pas coché et que "Reference Type" est "Reference Type" est "Relative to Project" avant de cliquer sur "Add". Vous pouvez également faire un clic droit sur le navigateur de votre projet et sélectionner Ajouter des fichiers à "MonProjet"".

Lorsque j'ai fait glisser le fichier ZXingWidget.xcodeproj dans mon projet, il n'y a pas eu de dialogue. Le projet s'est directement ajouté au projet et je n'ai pas pu définir les propriétés "copy items" et "Reference Type". Je ne sais pas s'il s'agit d'une nouvelle fonctionnalité de Xcode 4.5 ou d'un bug. C'est la seule étape que je n'ai pas pu suivre correctement selon le fichier README.

Vous disposez de toutes les informations dont je dispose. Cela fait six heures que j'essaie de résoudre ce problème. Une idée ?

0 votes

Bonjour, j'ai intégré le projet avec l'aide de vos commentaires.mais je rencontre toujours des erreurs après l'intégration réussie.j'ai exécuté le scan test(type de code dans notre projet) exemple aussi mais j'ai essayé les exemples de code-barres.j'ai importé quelques fichiers de BarcodeExample.j'ai obtenu une définition d'interface en double d'une classe "ResultParser".comment puis-je résoudre ce problème ?

0 votes

Pour moi, il s'agissait d'ajouter libc++.dylib à mon projet, voir : stackoverflow.com/questions/15070556/

57voto

Krishnabhadra Points 18384

Enfin, j'ai réussi à le faire fonctionner Pour tous ceux qui rencontreront ce problème à l'avenir

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

    Le README de ZXing explique pourquoi nous avons besoin de cela

    Il peut arriver qu'en essayant de construire votre propre projet avec ZXingWidgetController vous obteniez des erreurs de linker comme "undefined reference à". Si cette erreur ressemble à une référence indéfinie en c++, renommer main.m en main.mm (suffixe de source Objective-C++) peut résoudre le problème.

  2. Renommer le fichier (ViewController/View) qui utilise la librairie ZXing de sorte qu'il porte également l'extension .mm.

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

  4. En principal projet -> Paramètres de construction Faites défiler les pages et découvrez les options, Dialecte du langage C++ y Bibliothèque standard C++ . Sélectionner les options "Défaut du compilateur" pour les deux. (C'est l'étape étape que j'ai manquée, elle est nécessaire car le dernier modèle XCode a un les paramètres par défaut du compilateur sont différents de ce qu'ils étaient dans les anciennes versions). anciennes versions).

  5. Il se peut également que vous deviez définir le paramètre " Construire une architecture valide Seulement L'indicateur " est défini comme NO . Dans mon cas, ce champ était déjà NO

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

Mise à jour

Le décembre 2013, Google a retiré ZXing iOS/Objective Port C. Le projet Zxing pour iOS n'est donc plus maintenu et mis à jour pour les nouvelles versions d'iOS. De plus, Zxing ne supporte pas l'architecture Arm64 qui est l'une des architectures standard selon les nouvelles versions de XCode.

Les développeurs sont donc encouragés à passer à l'application cadre Apple natif pour lire les codes-barres qui est disponible à partir d'iOS7. Voir aussi este pour un tutoriel pas à pas.

0 votes

Les trois premiers sont nécessaires. (1) et (2) sont couverts par le README. (3) est la clé pour passer à Xcode 4.5 à partir d'une version antérieure et ces changements ont été apportés aux projets dans le SVN mais les projets plus anciens devront être mis à jour. (4) est la valeur par défaut dans les fichiers du projet zxing, donc si vous avez dû les changer, c'est (probablement) parce que vous les aviez déjà personnalisés.

0 votes

@smparkes En ce qui concerne (4), non, je ne les ai pas personnalisés, j'ai créé un nouveau projet en utilisant xcode (projet vide)template en utilisant xcode 4.5.1 et il a des paramètres de compilateur différents.

0 votes

Ah, oui. Je peux reproduire cela. Ugh. Je suppose que nous devrions tester zxing avec les nouvelles valeurs par défaut. Double ugh.

10voto

Patrick Gibson Points 116

J'ai suivi toutes les suggestions ci-dessus, et bien que tout se compile correctement, la liaison é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é par :

  ___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'utilise Xcode 4.5.2. J'ai renommé main.m en main.mm, mon contrôleur de vue a également été renommé de .m en .mm, l'architecture est partout "armv7 armv7s".

Soupir...

Mise à jour

Quelqu'un sur les devforums d'Apple a eu la réponse à mon problème :

Il semble que les bibliothèques standard C++ ne soient pas adaptées. 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éfinissez "C++ Standard Library" à "libc++", puis nettoyez tout et reconstruisez.

Si cela ne fonctionne pas, essayez de définir "C++ Standard Library" à "libstdc++" à la fois dans votre projet et dans ZXingWidget.xcodeproj.

La première suggestion a fait l'affaire.

6voto

jimbob Points 1032

J'ai résolu le problème en changeant une valeur sur le projet que vous avez glissé et déposé dans xcode.

enter image description here

Ensemble :

Construire l'architecture active uniquement -> Debug -> Non

J'espère que cela aidera les gens :) !

6voto

RawMean Points 1761

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

enter image description here

0 votes

Cette solution me permet de lancer le projet Cocos2d-x v2.2.2 C++. Merci de votre compréhension.

4voto

diadyne Points 1093

Il peut également être nécessaire de définir l'indicateur "Build Active Architecture Only" de la cible ZXingWidget sur "NO".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X