[Résolu]Fichue bibliothèque.a
Bonjour tout l'monde.
Voilà , hier j'avais un p'tit soucis, mais je me suis avisé de poster, car avec un peu de recul, j'ai trouvé l'erreur débile que j'avais faite...
Sauf que là , même avec du recul, je m'y perds...
Il s'agit d'intégrer un bibliothèque.a à mon projet.
Je suis allé chez le presta externe qui s'occupe de ça. Ils ne développent pas leurs trucs pour iOS, mais font du Java et du C.
J'ai donc suivi un tuto pour créer la bibliothèque avec les sources en C qu'ils m'avaient donnés (j'ai supprimé ensuite les sources).
J'ai un beau libBibliNomPresta.a, et ça c'était y'a déjà pas mal de temps.
J'ai suivi les posts très intéressants du Crocodile (Notamment celui-là et celui-ci).
Cependant, je suis perdu.
Concrètement, voici ce que j'ai :
- libBibliNomPresta.a
- fichierHeaderLieeALaBibliotheque.h
Dans Build Phases, j'ai ajouté bibliotheque.a à mes Link Binary with Libraries.
J'ai essayé de changer de Location libBibliNomPresta.a
(via le Project Navigator, Relative to Group ou Relative to Build Projects).
J'ai mis dans Build Settings/Linking/Other Linker Flags : -ObjC
J'ai mis dans Build Settings/Linking/Search Paths/Header Search Paths libBibliNomPresta.a
Bon, là , je suis perdu...
fichierHeaderLieeALaBibliotheque.h doit avoir un #include bibliotheque.a, non ?
Ensuite, dans ma classe souhaitée, je fais un #import "fichierHeaderLieeALaBibliotheque.h, non ?
Alors pourquoi est-ce que j'ai cette grosse m*rd* de message d'erreur à la compilation :
ld: library not found for -lBibliNomPresta
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Notons que j'ai perdu le "lib" dans le truc... J'aurais merdé lors de la création de cette bibliothèque...
Au pire, je risque d'avoir à retourner chez eux histoire de faire ça proprement si c'est ça l'erreur ?
Réponses
Tu as effectivement les bonnes références de post, mais je te conseille aussi la vidéo du Cocoaheads qui est citée dans ces posts. Perso, çà m'avait permis de résoudre mes problèmes. Je ne me souviens plus les messages que j'avais, mais ce n'est pas impossible que j'ai eu le même message, résolu après avoir visionné la video...
CocoaHeads Rennes #12: Workspaces, librairies et ressources ...
Le temps que je télécharge la vidéo et débute, j'ai déjà appris un truc :
-ObjC : optionnel vu que j'ai du code C.
Update :
Je remarque que mon fichier ma bibliothèque.a n'a pas le zoli icône archive...
Est-ce grave docteur ? D'où la possibilité que j'ai merdé auparavant ?
Mais perso, la vidéo reste le meilleur prof ! Rien ne vaut une demo. C'est pareil avec les vidéo de la WWDC...
C'est déjà un bon début, ça va dire au linker que tu veux linker avec une bibliotheque.a quand il fait l'édition des liens, c'est bien ce qu'il faut faire.
Heu... c'est les Header Search Path, autrement dit en français le chemin (path) où rechercher (search) les headers, pour lui dire dans quels dossiers il doit aller chercher quand tu lui demandes de faire un #import ou #include d'un header dans ton code pour qu'il sache où trouver ces ".h"... pourquoi tu mets le nom de ta librairie dans un truc qui non seulement te parle de header et pas de librairie, et te demande un path (chemin vers un dossier) et pas un nom de fichier ?
Heu pardon ?
Depuis quand on doit faire un #include ou #import... d'un fichier ".a" (fichier binaire) ??! On je fait des #include ou #import que de code source, et à fortiori de headers (".h"), mais faire un #import de... code binaire ?!?!! T'as fumé quoi ?
Oui, ça d'accord, pour que dans ta classe souhaitée en question, tu puisses appeler les méthode de ta bibliothèque sans que le compilateur gueule en disant qu'il ne les connait pas. En important le fichier ".h" e compilateur va connaà®tre la signature des fonctions dans ta librairie et ne gueulera donc pas si tu tentes de les utiliser.
D'une part, un message d'erreur n'est jamais une grosse m*rd* de message d'erreur. L'erreur se situe quasi tout le temps entre la chaise et le clavier, et les messages d'erreurs sont la plupart du temps explicites et là pour t'aider. En l'occurrence celui-ci est parfaitement explicite, justement : il te dit qu'il n'arrive pas à trouver la librairie (le ".a" avec lequel tu lui demandes de linker). S'il ne le trouve pas, c'est sans doute parce que tu ne lui as pas dit où la librairie se trouvait, où il pouvait bien aller la dénicher. Il est certainement allé chercher dans les répertoires officiels du système (/lib, /usr/lib, ...) en se disant que c'était p'tet une librairie système mais n'a évidemment rien trouvé.
Il faut lui indiquer ce chemin via le Build Setting "Library Search Path" (= "Chemin(s) où Chercher pour trouver les Librairies (.a)"), évidemment, sans quoi il ne peut pas deviner !!!
Non ça c'est normal, ça fait partie des conventions pour les librairies. Quand tu passes le flag "-lABC" ça veut dire "link avec la librairie qui s'appelle libABC". Il rajoute tout seul le "lib" devant comme un grand, c'est normal.
Rien à voir. C'est parce que sur mon Mac perso, j'ai une application qui sait ouvrir les fichiers à l'extension ".a" et donc cette application a une icône associée aux fichiers de ce type. Si j'avais pas cette application, et qu'aucune application OSX n'était associée aux fichiers d'extension ".a" sur ma machine (comme c'est le cas pour ma machine de taf par exemple) j'aurais une bête icône de fichier générique, comme toi.
Je confirme.
En conclusion :
- Ne met pas n'importe quoi dans ton "Header Search Path", là t'as mis qqch qui n'a aucun sens
- Essaye aussi de ne pas raconter n'importe quoi concernant les #import (faire un #import d'un .a... je m'en suis toujours pas remis...)
- L'erreur que tu as est tout à fait explicite, il suffit de la lire et comprendre ce qu'elle veut dire, ce qui est assez direct : elle dit juste qu'il n'a pas réussi à trouver la lib. Il faut donc que tu lui indiques le dossier où il pourra la trouver, via le setting "Library Search Path"
Ah oui en plus, tu me l'avais déjà dit ! Si j'avais relu tout mon post j'aurais pu le dire à Larme !
O_o Tu vas nous casser notre Ali Larme ? ;D
Putain, tu pointes du doigt des erreurs débiles, et tout d'un coup ça devient clair que j'suis trop crevé (+stressé ?) pour ne pas les avoir remarquées >_<
Alors...
Concernant l'icône, Ok. Je pensais qu'au moins XCode allait lui mettre le p'tit truc de pseudo Panthéon, et vu que t'en avais un autre, j'ai eu un gros doute...
L'include du .a : C'est vrai qu'après coup, j'ai l'air d'un abruti...
L'erreur entre Header/Library dans le Search Path, j'sais pas comment j'ai fait pour passer à côté de celle-là , s'pas possible...
Pour moi, l'erreur est explicite. Je me suis déjà confronté à ce genre d'erreur... Il me semble que c'est le même type d'erreur qu'on a lorsqu'on a oublié d'importé un framework... Juste que pour moi, il me semblait importé correctement (vu qu'il l'avait été mis comme un des "frameworks" dans le Build Phases). Du coup, je râlais plus parce que je ne comprenais pas pourquoi il me le sortait que contre son indication.
Et ne t'inquiètes pas, je suis très grand fervent du PEBKAC, et je suis prêt m'f'aire considérer à n'importe quel moment de problème.
Résultat des courses :
Je fais une bonne nuit de sommeil avant de repartir. J'pensais continuer un peu chez moi, mais là , non, c'est pas possible, ça va être pire...
Avant de dormir, passes toi la video en boucle, quand tu te réveilleras tu auras tout compris !
Après une p'tite nuit de sommeil un peu courte à mon goût et un café...
Y'a peut-être des trucs que j'ai mis inutilement, mais au moins ça a compilé... C'est déjà un bon point, dans la journée, je vais voir si ça marche...
Alors qu'est-ce que j'ai modifié :
J'ai mis dans Header Search Paths : ${SRCROOT}, en bref, un "pwd" du .xcodeproj, car le maBibli.h se trouve au même niveau (ouais, je sais, c'est pas encore rangé niveau Finder)...
Dans le Library Search Paths, j'ai mis de même (même raison), et j'ai rajouté le "-lBibliMachinChose" (cf. ce que me disait le message d'erreur). Si j'ai bien compris, le "-lBibliMachinChose" est optionnel, mais là , j'lui dis clairement de ne chercher que celle-là ...
J'ai viré les #import "fichier.a", qui de toute manière j'avais déjà commenté... Un éclair de lucidité hier dans mes bêtises ?
Je trouve par contre dommage qu'XCode ne devine pas lui-même, après avoir fait un ajout de mon .a comme si c'était un framework qu'il doive remplir cela. Il y aurait des raisons qui m'échappent ?
J'ai viré le armv7s de mon building, car j'ai eu l'erreur comme quoi y'avait pas pour armv7s (oui, quand j'ai compilé la bibli, j'étais encore sous un vieux XCode)... Normalement, cela devrait tout de même marcher sur iPhone 5, mais je checkerais ça plus tard...
Du coup, merci Ali & Alf...
Je reconnais volontiers qu'hier j'étais le "P" de PEBKAC, et j'trouve encore hallucinant de ne pas avoir remarqué ces p'tites nuances (Header/Library Paths notamment) et pourtant j'y fais plutôt attention en général...
Note : J'devrais passer en résolu le topic quand j'aurais vérifié que tout marche nickel dans la journée.
Oui, si tu rajoutes la librairie libBibliMachinChose dans la phase "Link Library With Binary" cela a le même effet que de rajouter -lBibliMachinChose dans les Other Linker Flags, au final.
Oui, c'est vrai que ça c'est étrange... comme tu as rajouté le fichier explicitement, il devrait le trouver quand même, c'est bizarre/dommage... Faudrait que je fasse le test de mon côté. C'est sélectionné quoi comme chemin dans le popup "Location" qd tu sélectionnes ton .a dans la liste à gauche ? Relative to Group ?
Oui tout à fait, l'iPhone 5 a un processeur armv7s, mais sait aussi exécuter les instructions armv7. Si tu compiles en armv7s ça sera + optimisé, mais si tu compiles en armv7 tout court ça marchera quand même.