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?
7 réponses
enfin, je l'ai fait marcher.. Pour tous ceux qui rencontreront cela dans le futur..
-
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
-
renommer le fichier (ViewController / View) qui utilise ZXing libray fonctions de sorte qu'il a également.mm extension.
-
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.
-
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.)
-
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.
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.
je l'ai résolu en changeant une valeur sur le projet que vous glissés et déposés dans xcode.
Set:
Construire Active Seulement L'Architecture -> Debug -> Pas De
l'Espoir qui aide les gens :)!
Cela a résolu le problème pour moi. Rien d'autre n'a fonctionné.
il peut également être nécessaire de définir le drapeau" Build Active Architecture Only "de la cible ZXingWidget à"NO".
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.
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.