web-dev-qa-db-fra.com

IOS7 (uniquement) problème de liaison stdlibc ++

J'ai besoin d'aide. J'avais un cadre qui utilisait stdc ++ comme std: string. Maintenant, quand j'ai créé une nouvelle application pour IOS7 uniquement, il y a un problème avec la liaison de ce cadre en raison de problèmes avec la bibliothèque stdc ++:

Symboles non définis pour l'architecture armv7 "std :: basic_string, std :: allocator> :: _ Rep :: _ S_empty_rep_storage", référencé depuis ...

J'ai découvert quelque chose d'étrange que lorsque je change la cible Deplyment en ios6 dans cette application, tout fonctionne bien. Avec ios7, je vois des erreurs.

J'ai déjà défini un indicateur dans d'autres indicateurs de l'éditeur de liens: -lstdc ++

Une idée de ce que fait AMI mal?

28
MarekM

Juste une mise à jour sur cette réponse:

Cette étape est très importante!

Assurez-vous que C++ Standard Library est défini sur libstdc ++ (bibliothèque standard GNU c ++) dans le Apple LLVM 5.0 Compiler Build Settings

Contexte:

J'ai une application iOS qui a brutalement cessé de se construire pour iOS 7 avec des erreurs de lien de bibliothèque standard. J'avais testé l'application avec succès sur le simulateur et sur un iPad mini, et je l'ai archivée également, mais quand j'ai ajouté un iPhone 5S pour les tests, j'ai commencé à obtenir des erreurs de lien (peut-être à cause d'une nouvelle architecture dans le mix?).

En recherchant les erreurs de lien sur Google, j'ai trouvé des conseils pour ajouter explicitement libstdc ++. Dylib aux bibliothèques liées. Cela n'a pas fonctionné.

J'ai expérimenté en ajoutant à la place libstdc ++. 6.dylib aux bibliothèques liées; cela a éliminé les erreurs de lien, mais l'application s'est écrasée très tôt dans le code de la bibliothèque C++ standard.

La suppression des ajouts explicites de la bibliothèque et la modification du paramètre du compilateur dans les paramètres de build, comme indiqué ci-dessus, ont corrigé les erreurs de liaison et le problème d'exécution.

Merci à rimestad pour le pointeur!

27
Doug Knowles

Pour être honnête, je n'aime pas la réponse ci-dessus, car elle utilise la bibliothèque statique et non la dynamique!

J'ai moi-même eu le problème et j'ai découvert que le problème est que xcode ne peut pas trouver de fichiers C++ dans votre projet et suppose donc que le libstc ++ n'est pas nécessaire!

Assez ennuyeux lorsque vous créez un lien vers une bibliothèque statique qui l'utilise !!

Solution :

  • Ajoutez un fichier .mm vide à votre projet!
  • Assurez-vous que C++ Standard Library est défini sur libstdc ++ (bibliothèque standard GNU c ++) dans les paramètres de construction

Cela a fonctionné pour moi et je n'ai pas eu à ajouter -lstdc ++ à d'autres indicateurs de l'éditeur de liens !

J'espère que cela aide les autres avec le même problème.

68
rimestad

Merci de votre aide. J'ai trouvé une solution. J'utilisais l'indicateur -lstdc ++ dans d'autres indicateurs de l'éditeur de liens, mais ce n'est plus suffisant maintenant. J'ai dû ajouter "libstdc ++. 6.0.9.dylib dans BuildPhases-> Link Binary With Libraries. Il y avait quelque part dans les informations réseau que xcode avait des problèmes avec la sélection de lib ios7 stdc ++ lib et il devait être sélectionné manuellement.

Cordialement, Marek

27
MarekM

J'ai eu un problème similaire, mais la réponse de @ MarekM ne résout qu'une partie de mon problème, j'ai donc essayé d'ajouter libstdc ++. Dylib et libstdc ++. 6.dylib, et cela fait disparaître toute erreur de compilation.

3
wzhang84