2010-05-17 7 views
10

J'ai donc développé un moteur pour l'iPhone avec lequel j'aimerais construire quelques jeux différents. Plutôt que de copier et coller les fichiers du moteur à l'intérieur du répertoire de projet de chaque jeu, j'aurais un moyen de lier le moteur à chaque jeu, donc si je dois y apporter une modification, je ne dois le faire qu'une seule fois. Après avoir un peu ralenti, il semble que les bibliothèques statiques soient la meilleure façon de le faire sur l'iPhone.Création d'une bibliothèque statique Objective-C++ dans Xcode

J'ai créé un nouveau projet appelé Skeleton et copié tous les fichiers de mon moteur. J'ai utilisé le guide this pour créer une bibliothèque statique, et j'ai importé la bibliothèque dans un projet appelé Chooser. Cependant, lorsque j'ai essayé de compiler le projet, Xcode a commencé à se plaindre de certaines structures de données C++ que j'avais incluses dans un fichier appelé ControlScene.mm. Voici mes erreurs de construction:

"operator delete(void*)", referenced from: 


     -[ControlScene dealloc] in libSkeleton.a(ControlScene.o) 


     -[ControlScene init] in libSkeleton.a(ControlScene.o) 


     __gnu_cxx::new_allocator<operation_t>::deallocate(operation_t*, unsigned long)in libSkeleton.a(ControlScene.o) 


     __gnu_cxx::new_allocator<operation_t*>::deallocate(operation_t**, unsigned long)in libSkeleton.a(ControlScene.o) 


    "operator new(unsigned long)", referenced from: 


     -[ControlScene init] in libSkeleton.a(ControlScene.o) 


     __gnu_cxx::new_allocator<operation_t*>::allocate(unsigned long, void const*)in libSkeleton.a(ControlScene.o) 


     __gnu_cxx::new_allocator<operation_t>::allocate(unsigned long, void const*)in libSkeleton.a(ControlScene.o) 


    "std::__throw_bad_alloc()", referenced from: 


     __gnu_cxx::new_allocator<operation_t*>::allocate(unsigned long, void const*)in libSkeleton.a(ControlScene.o) 


     __gnu_cxx::new_allocator<operation_t>::allocate(unsigned long, void const*)in libSkeleton.a(ControlScene.o) 


    "___cxa_rethrow", referenced from: 


     std::_Deque_base<operation_t, std::allocator<operation_t> >::_M_create_nodes(operation_t**, operation_t**)in libSkeleton.a(ControlScene.o) 


     std::_Deque_base<operation_t, std::allocator<operation_t> >::_M_initialize_map(unsigned long)in libSkeleton.a(ControlScene.o) 


    "___cxa_end_catch", referenced from: 


     std::_Deque_base<operation_t, std::allocator<operation_t> >::_M_create_nodes(operation_t**, operation_t**)in libSkeleton.a(ControlScene.o) 


     std::_Deque_base<operation_t, std::allocator<operation_t> >::_M_initialize_map(unsigned long)in libSkeleton.a(ControlScene.o) 


    "___gxx_personality_v0", referenced from: 


     ___gxx_personality_v0$non_lazy_ptr in libSkeleton.a(ControlScene.o) 


     ___gxx_personality_v0$non_lazy_ptr in libSkeleton.a(MenuLayer.o) 


    "___cxa_begin_catch", referenced from: 


     std::_Deque_base<operation_t, std::allocator<operation_t> >::_M_create_nodes(operation_t**, operation_t**)in libSkeleton.a(ControlScene.o) 


     std::_Deque_base<operation_t, std::allocator<operation_t> >::_M_initialize_map(unsigned long)in libSkeleton.a(ControlScene.o) 


ld: symbol(s) not found 


collect2: ld returned 1 exit status 

Si quelqu'un pourrait offrir un aperçu des raisons pour lesquelles ces problèmes sont INTERVENUES, je vous en serais reconnaissant.

Répondre

17

Le problème est que votre bibliothèque est dynamiquement liée à libstdC++. Quant à la façon de le réparer, vous devriez essayer "-static", "-static-libstdC++", et "-static-libgcc" dans diverses combinaisons lors de la construction de votre bibliothèque (pas sûr de ce qui est nécessaire, mais une combinaison de rends-le complètement statique).

Modifier
Eh bien, il se trouve que vous êtes autorisé à lier dynamiquement contre libstdC++ sur l'iPhone, donc en fait une meilleure solution est de simplement mettre « -lstdC++ » dans (c'est, indiquer explicitement la libstdC++) dans ta construction.

+0

Où sont situés ces? – LandonSchropp

+0

@helixed, si vous construisez la bibliothèque avec un Makefile ou depuis la ligne de commande, vous pouvez les ajouter à votre invocation de g ++. Si vous utilisez Xcode, je crois qu'il y a quelque chose comme "autres drapeaux" dans les paramètres de construction de votre projet où vous pouvez les entrer. –

+1

Yup, a parfaitement fonctionné. Le bon endroit pour le mettre est d'autres drapeaux de liaison au cas où quelqu'un se demandait. Merci pour l'aide. – LandonSchropp

1

J'ai résolu le problème en allant dans les paramètres de construction du Sélecteur, en recherchant "Compiler la source sous" et en sélectionnant Objective-C++. C'est probablement une solution sale, mais cela a fonctionné.

+0

cela a fonctionné car il est maintenant lié à libstdC++. –

+0

Cela signifie-t-il que cela revient à ajouter le drapeau -lstdC++? –

24

Réglez le « -lstdC++ » à d'autres Linker Drapeaux

+0

Cela a fonctionné pour moi. – Manali

+0

Super !! .... +1 – TheTiger

1

je suis tombé sur cette question en essayant de lier un .framework. J'ai réussi à le corriger en ajoutant un vide fichier cppstub.mm en tant que source (à Compile Sources de phase)

Je suppose que ce doit être force une sorte de compilation C lorsque vous faites cela, ne me demandez pas pourquoi

Questions connexes