Carthage - dyld: lazy symbol binding failed: Symbol not found

Bonjour à tous et à toutes,

Depuis près d'une semaine, j'essaye de compiler ma librairie avec Carthage pour pouvoir l'utiliser dans mes propres projets.
J'ai mis quelques jours à arriver à la faire compiler (elle comporte quelques dépendances externes), et maintenant que ça fonctionne, j'ai cette erreur:

Est-ce que quelqu'un a une idée du pourquoi ?
Et comment je peux résoudre ce petit soucis ?

Merci,

Bonne journée,

Alexandre

Mots clés:

Réponses

  • CéroceCéroce Membre, Modérateur

    J'ai assez peu travaillé avec Carthage.

    En tout cas, Carthage génère une framework dynamique par dépendance. Chaque framework contient une dylib qui est linkée dynamiquement au lancement de l'appli.

    Déjà, ça a l'air de ne pas trouver un symbole. Sais-tu quelle est cette fonction (write) appelée par ta lib ?

  • PyrohPyroh Membre
    octobre 2019 modifié #3

    Ça c'est le genre de plan compliqué.
    Premièrement il te faut vérifier les versions de Swift employées pour compiler les-dites librairies. Si mes souvenirs sont bon Carthage utilise xcbuild qui est lié à la version active de Xcode. Il se peut que tu compile avec Xcode 11 ton app mais que Carthage utilise Xcode 10. xcode-select -p dans la ligne de commande te dira lequel est utilisé pour xcbuild.

    Une fois que tu as vérifié ça, utilise MacDependency il te permet de savoir ce qu'un binaire va aller chercher dans les librairies qui lui sont liées, vérifie aussi ton @rpath qui peut être ennuyant.

    On part du principe que tu compile tout depuis les sources y compris RealmSwift, n'utilise pas les binaires distribués par Carthage.

    Edit : J'ai oublié le plus important si tu peux utiliser Swift Package Manager utilise-le ça gère ce genre de conneries qui font perdre un temps bête.

  • Hello à tous les deux,

    Tout d'abord, merci pour vos réponses.

    @Céroce

    Déjà, ça a l'air de ne pas trouver un symbole. Sais-tu quelle est cette fonction (write) appelée par ta lib ?

    La fonction write() appelée par la lib est une simple fonction write() de Realm, rien de très foufou...

    @Pyroh
    Je vais vérifier et tester ce que tu as mis dans ton message et je te tiens au courant dès que possible, merci!

    Edit : J'ai oublié le plus important si tu peux utiliser Swift Package Manager utilise-le ça gère ce genre de conneries qui font perdre un temps bête.

    Qu'est-ce que j'en ai envie... Mais je ne peux pas le faire pour cette lib (demande du client)... 😢

    Merci à tous les deux,
    Je vous tiens au courant dès que j'ai du nouveau,

    Bonne journée,

    Alexandre

  • Bon bon, j'ai ouvert le Framework avec MacDependency, mais j'ai un peu de mal à comprendre: tous les potentiels soucis (si je regarde ce qui est en bleu/rouge) pour lesquels la version courante est différente de la version compatible sont ... des frameworks d'Apple (UIKit, CoreFoundation, etc)...

    Exemples:

    Que faire dans ce cas là?

    On part du principe que tu compile tout depuis les sources y compris RealmSwift, n'utilise pas les binaires distribués par Carthage.

    En compilant avec Carthage, je précise bien --no-use-binaries pour tout recompiler avec le Xcode de ma machine.

    Premièrement il te faut vérifier les versions de Swift employées pour compiler les-dites librairies. Si mes souvenirs sont bon Carthage utilise xcbuild qui est lié à la version active de Xcode. Il se peut que tu compile avec Xcode 11 ton app mais que Carthage utilise Xcode 10. xcode-select -p dans la ligne de commande te dira lequel est utilisé pour xcbuild.

    Je viens de vérifier, mais je n'ai qu'une seule version d'Xcode, et il utilise bien celle là, donc ça devrait être bon à ce niveau là.

    vérifie aussi ton @rpath qui peut être ennuyant

    Qu'est ce que je devrais trouver exactement dans le @rpath ?
    A priori, le chemin vers les dépendances de ma lib ?

    Merci,

  • AlesckAlesck Membre
    octobre 2019 modifié #6

    Ceci dit, j'ai aussi ce crash pour des librairies qui ne sont pas les miennes (Alamofire), mais je suppose que le soucis doit venir de quelque chose que je fais mal...

    EDIT: Désolé pour les multi-posts; j'essaye de fournir un maximum d'infos...

  • Pour @rpath un peu de lecture s'impose. Le but n'étant pas d'expliquer ce qui est déjà très bien expliqué ailleurs 😃

    Vérifie la structure dans ton app et regarde bien si les frameworks en question sont là où on les cherche.

    Au passage tu as regardé sur les issues GitHub de Carthage si le problème n'est pas déjà documenté ?

  • Pour @rpath un peu de lecture s'impose. Le but n'étant pas d'expliquer ce qui est déjà très bien expliqué ailleurs

    Merci pour le lien :smile:

    Vérifie la structure dans ton app et regarde bien si les frameworks en question sont là où on les cherche.

    A priori, oui, j'ai vérifier que tout était bien indiqué dans les Builds Settings, mais je vais encore re-vérifier.

    Au passage tu as regardé sur les issues GitHub de Carthage si le problème n'est pas déjà documenté ?

    Oui, j'ai déjà fait le tour de tout ce que je pouvais trouver sur les repos Github...

  • @Alesck a dit :

    Vérifie la structure dans ton app et regarde bien si les frameworks en question sont là où on les cherche.

    A priori, oui, j'ai vérifier que tout était bien indiqué dans les Builds Settings, mais je vais encore re-vérifier.

    Là pour le coup je parlais du .app généré, vérifie si les frameworks sont bien dans les dossiers comme prévu.

  • Là pour le coup je parlais du .app généré, vérifie si les frameworks sont bien dans les dossiers comme prévu.

    A priori, oui c'est bien le cas, ils se retrouvent bien dans le dossier "Frameworks" de maLib.framework, donc ça devrait le faire, non?

  • Ah c'est sûrement ça ton soucis. Si tu regarde dans ton tout premier screen la recherche est dans path/TonApplication.app/Frameworks/. Ce que tu semble dire c'est que tout se trouve dans path/TonApplication.app/Frameworks/TonFramework.framework/Frameworks/.
    Et ça, ça ne peut pas aller.

  • AlesckAlesck Membre
    octobre 2019 modifié #12

    Alors, je suis d'accord, du coup j'ai fais plusieurs tests:
    J'ai changé ce path, pour que tout corresponde bien (que ce soit dans Framework.framework ou bien dans /Frameworks), mais l'erreur persiste.

    Aussi, j'ai parfois cette erreur:


    Je crois que je m'emmêle les pinceaux, mais je n'arrive pas à les démêler 😢

  • Delenda Carthago ... disait Caton l'ancien !

  • PyrohPyroh Membre
    octobre 2019 modifié #14

    On va faire plus "simple". J'ai un peu du mal à voir ce que tu fais et comment tu le fais.

    Je me suis déjà cassé les dents sur le sujet et j'ai appris dans la douleur à démêler ce genre de situation. Seulement il faudrait que je vois ce que tu fais alors voilà ce que je te propose :
    Il est clair que tu ne me donnera pas accès à ton code —c'est logique c'est pour un client— mais ce que tu peux faire c'est un mock-project qui reprend la structure de ton vrai projet mais sans le code. Tu poste le tout ici en .zip ou sur un git public ou limité (Pyroh sur git[hub|lab]) et je vois ce que je peux faire. Avec une préférence pour le git tu pourras voir les changements plus facilement comme ça 😉

  • AlesckAlesck Membre
    octobre 2019 modifié #15

    Merci pour la proposition @Pyroh, mais je ne suis pas sûr de pouvoir le faire: si j'ajoute les libs dans un projet "vide", tout se passe bien, ça crash uniquement lorsque je fais appelle à la lib du client, et celle là, je ne peux pas l'inclure, nul part... (Idem pour les librairies internes...)

    Je réfléchis à une solution pour pouvoir avoir quelque chose qui y ressemble pour être au plus près de mon soucis.

    Je te tiens au courant dès que possible.

    Encore merci,

    Alexandre

  • Tu as une lib fournie par le client pré-compilée ? C'est sûrement là le soucis.
    Passe la dans le tool que j'ai linké et regarde le @rpath c'est peut-être là ton soucis.

  • Non non, la lib est créée de mon côté, j'ai bien vérifié via ton outils, mais tout à l'air bon de ce côté...
    J'ai une dernière idée à tester ici, je vois si ça fonctionne ou pas 🤞

  • Ok tien nous au jus ça va être intéressant de voir la solution (si c'est la solution 😉).

  • Disons que j'avance et essaye une chose à la fois, pour trouver là où ça casse 😅
    Entre temps, je vais regarder ce que je peux partager ou pas, et voir à quel point je peux reproduire ma situation pour la partager...

  • Bon, non @Pyroh, le soucis ne vient pas de la où je cherchais...
    Par contre, je pense que c'est bien un soucis de @rpath, je regardais juste pas la bonne lib (c'est pas celle que je pensais qui posait soucis)...
    Je regarde pour une solution...

  • Question: est-ce que cette histoire de @rpath est quelque chose de nouveau?
    Je veux dire, avant de passer à Swift 5.1 et Catalina (il y a quelques mois), on l'avait déjà fait avec les mêmes libs et on avait pas eu de soucis...

    (Ceci dit, quand je regarde ces deux libs (les fichiers .framework) avec MacDependency, il y a les erreurs, même pour la version qui fonctionnait... Est-ce que cet outils fonctionne aussi pour les libs iOS ?)

  • J'ai forké et mis à jour le code de Mac Dependency maintenant il s'affiche correctement en dark mode.

    L'outil fonctionne pour les lib iOS. Le passage à Xcode 11 a peut être changé quelque chose, pour Swift 5.1 je ne pense pas et Catalina certainement pas. Enfin sauf si tu as migré depuis Swift 4.2 c'est plus compliqué.
    Le @rpath de ta lib est égal à quoi ?

  • La version qui fonctionnait:

    La version qui ne fonctionne pas:

    Après, dans les deux cas, j'ai ces erreurs:

  • Je vois le problème.
    Du point de vue de ta libraire on va chercher les dépendances dans

    path/TonApp.app/Frameworks/TonFramework.framework/Frameworks

    Alors qu'en fait toutes les dépendances sont installées dans

    path/TonApp.app/Frameworks/

    De tête il faut rajouter @loader_path/Frameworks au @rpath de ton framework. C'est le propriété Runpath Search Paths dans les Build Settings du projet de ton framework.

  • Merci pour la réponse @Pyroh !
    Je teste ça cet après-midi et te tiens au courant 😇

  • Bon, c'est résolu! 😅

    En fait, le soucis ne venait pas de Carthage directement; en testant des choses, le projet s'est un peu désorganisé et la structure est devenue impossible à comprendre clairement. Du coup, je pense que Carthage et Xcode ne s'y retrouvait plus (ce qui, après coup, me parait plutôt logique, parce que au final j'avais aussi du mal à m'y retrouver).

    En repartant d'un projet clean et en y ajoutant les sources petits à petits, le problème s'est résolu sans soucis!

    Un grand merci pour ton aide @Pyroh !
    La prochaine fois, si je tombe sur des erreurs de ce style, je m'y prendrais autrement!

    Bonne journée,

  • Heureux de voir que tu as pu résoudre ton problème et continuer à travailler 😃

  • Merci 😎

    Je fais face à une autre erreur maintenant 😅
    Ca va finir par aller 😅

    dyld: Library not loaded: @rpath/BoltsSwift.framework/BoltsSwift
      Referenced from: /Users/alexandrecools/Library/Developer/CoreSimulator/Devices/AAA91E2F-9310-4BC4-980A-F0081B949A95/data/Containers/Bundle/Application/1AC9A142-9386-4374-8B85-2B1D68B25EAA/Test.app/Frameworks/MonFramework.framework/MonFramework
      Reason: Incompatible library version: MonFramework requires version 1.0.0 or later, but BoltsSwift provides version 0.0.0
    

    Ceci dit, je suis pas sûr que Carthage soit le problème, parce qu'il me fetch bien la version 1.5.0 de Bolts quand je fais un update...

  • PyrohPyroh Membre
    octobre 2019 modifié #29

    C'est étrange ça mais je pense que c'est dans la config de ton projet j'ai eu ce genre de soucis quand j'ai fait xspm. Sur iOS il faut une version pour les librairies et elle n'est pas initialisée par défaut –macOS s'en tape.
    C'est la propriété CURRENT_PROJECT_VERSION mets la à 1. Teste avec ça si ça ne règle pas le soucis on cherchera plus loin 😉

Connectez-vous ou Inscrivez-vous pour répondre.