Pourquoi Leopard altère-t-il certains symboles avec $ non_lazy_ptr? Plus important encore, quelle est la meilleure méthode pour corriger les erreurs de symboles indéfinies parce qu'un symbole a été modifié avec $ non_lazy_ptr?
Répondre
De: Developer Connection - Indirect Addressing
adressage indirect est le nom de la technique de génération de code qui permet aux symboles définis dans un fichier à être référencés à partir d'un autre fichier, sans que le fichier de référencement pour avoir une connaissance explicite de la mise en page du fichier cela définit le symbole. Par conséquent, le fichier de définition peut être modifié indépendamment du fichier de référence. L'adressage indirect minimise le nombre d'emplacements devant être modifiés par l'éditeur de liens dynamiques, ce qui facilite le partage de code et améliore les performances.
Lorsqu'un fichier utilise des données définies dans un autre fichier, il crée des références de symbole. Une référence de symbole identifie le fichier à partir duquel un symbole est importé et le symbole référencé. Il existe deux types de références de symboles: nonlazy et paresseux.
Les références de symboles non lustrées sont résolues (liées à leurs définitions) par l'éditeur de liens dynamiques lorsqu'un module est chargé. Une référence de symbole non lustrée est essentiellement un pointeur de symbole - un élément de données de la taille d'un pointeur. Le compilateur génère des références de symboles non lustrées pour les symboles de données ou les adresses de fonctions.
Les références de symboles paresseux sont résolues par le lieur dynamique la première fois qu'elles sont utilisées (pas au moment du chargement). Les appels suivants au symbole référencé sautent directement à la définition du symbole. Les références de symboles paresseux sont constituées d'un pointeur de symbole et d'un bout de symbole, d'une petite quantité de code qui déréférence directe et saute à travers le pointeur de symbole. Le compilateur génère des références de symboles paresseux lorsqu'il rencontre un appel à une fonction définie dans un autre fichier.
En langage humain: le compilateur génère des stubs avec $ non_lazy_ptr ajouté pour accélérer la liaison. Vous voyez probablement que la fonction Foo référencée par _Foo $ non_lazy_ptr n'est pas définie, ou quelque chose comme ça - ce ne sont pas la même chose. Assurez-vous que le symbole est effectivement déclaré et exporté dans les fichiers/bibliothèques d'objets auxquels vous liez votre application. Au moins, c'était mon problème, je pensais aussi que c'était un lien bizarre jusqu'à ce que je trouve que mon problème était ailleurs - il y a plusieurs autres causes possibles trouvées sur Google.
ranlib -c sur votre fichier de bibliothèque résout le problème
Si quelqu'un trébuche autre le même problème que moi:
Had a extern NSString* const someString;
dans le fichier d'en-tête, mais il a oublié de le mettre le fichier de mise en œuvre. comme NSString* const [email protected]"someString";
Ceci l'a résolu.
ranlib -c libwhatever.a
est un correctif solide pour le problème. J'ai eu le même problème lors de la construction de la bibliothèque PJSIP pour iOS. Ce type de bibliothèque utilise un système make basé sur autoconf, mais nécessite un peu de peaufinage de divers fichiers pour que tout se passe bien pour iOS. Dans le processus de faire cela, j'ai réussi à supprimer la ligne ranlib dans la règle pour les bibliothèques, puis a commencé à obtenir une erreur dans le lien de mon projet sur _PJ_NO_MEMORY_EXCEPTION
référencé de _PJ_NO_MEMORY_EXCEPTION$non_lazy_ptr
étant indéfini. L'ajout de la ligne ranlib au fichier de bibliothèque a permis de résoudre le problème. Maintenant, mon entrée complète pour LIBS dans les règles.mak est
$(LIB): $(OBJDIRS) $(OBJS) $($(APP)_EXTRA_DEP)
if test ! -d $(LIBDIR); then $(subst @@,$(subst /,$(HOST_PSEP),$(LIBDIR)),$(HOST_MKDIR)); fi
$(LIBTOOL) -o $(LIB) $(OBJS)
$(RANLIB) -c $(LIB)
Hope this helps autres aussi essayer d'utiliser UNIX générale configuré bibliothèques externes avec l'iPhone ou iOS.
- 1. compilez PHP GD-sur Mac OSX 10.5
- 2. Bibliothèques X11 sous OSX 10.5?
- 3. Exécution/compilation jdbc-sqlite sur OSX 10.5
- 4. Comment installer Glade sous Mac OSX Leopard
- 5. Comment configurer PEAR sur Mac OS X 10.5 Leopard
- 6. Construction de 10.5 dans Xcode 3.2 (sur Snow Leopard) erreur
- 7. Fonctionnalité de MenuKey sous OSX 10.5 et 10.6?
- 8. §non_lazy_ptr iphone sdk 3.0
- 9. Problème d'installation pyqt dans mac osx snow leopard
- 10. Problème Oracle Sqlplus sous Mac OSX Snow Leopard
- 11. ImageMagick OSX Snow Leopard mauvais type de CPU
- 12. Agent Compiling JVMTI (en utilisant GCC, sur OSX Snow Leopard)
- 13. Dans Mac OSX 10.5, il ne trouve pas mes commandes Terminal sudo, find, etc
- 14. Comment usurper une adresse MAC ethernet de l'interface Ethernet câblée avec MacBookPro et Leopard 10.5.6?
- 15. Snow Leopard QTJava Support
- 16. Explication de la disposition du répertoire JVM sous Mac OSX Leopard
- 17. Git instaweb Configuration httpd pour utiliser Apache2 sur le serveur OSX Leopard
- 18. OCUnit sur Snow Leopard VS Leopard
- 19. Python avec PIL et Libjpeg sur Leopard
- 20. Problèmes avec Snow Leopard, Django et PIL
- 21. Créer la même version de l'application RubyCocoa pour Leopard et Snow Leopard
- 22. Comment rendre avec yafaray sur mac osx
- 23. Mac OSX - Problème avec Xcode/Leaks
- 24. Déboguer 10.6 Projet en 10.5?
- 25. Symboles mathématiques dans vim
- 26. Multiplier les symboles définis
- 27. Raccourcis clavier Eclipse dans Mac OSX
- 28. Écrasement accidentel du framework système OSX Python
- 29. Création curseur de la souris/pointeurs dans OS X Leopard
- 30. Quelle est la syntaxe de ligne de commande pour les piles personnalisées pour le dock OSX Leopard?