Séquence de chargement différrent entre Tiger et Panther

mpergandmpergand Membre
09:34 modifié dans Vos applications #1
Bonjour à  tous,

J'ai un gros problème avec le chargement des frameworks.
Dans une appli, j'utilise 2 frameworks, la séquence de chargement dans Tiger est la suivante:
- chargement framework1
- chargement framework2
- chargement des nibs

Jusque là  tout semble logique, mais dans Panther, j'ai pas la même chose:
- chargement framework1
- chargement des nibs
- chargement framework2


??? ??? ???

Et ça ne me convient pas du tout !

Quelqu'un aurait-il une petite idée du pourquoi de la chose  :(

Réponses

  • Eddy58Eddy58 Membre
    09:34 modifié #2
    Oui, plutôt curieux comme problème, surtout si tu utilises des méthodes du framework2 dans les init des nibs...Est-ce que ce sont des frameworks embarqués ? :o
  • 09:34 modifié #3
    Moi je me demande pourquoi tu es dépendant de l'ordre de chargement des fichiers par un OS...
  • mpergandmpergand Membre
    juillet 2005 modifié #4
    Est-ce que ce sont des frameworks embarqués ?

    Oui.

    Moi je me demande pourquoi tu es dépendant de l'ordre de chargement des fichiers par un OS...


    Et en plus il faut que la framework1 se charge avant la framework2, car celle-ci signale sa présence à  la framework1.
    Il me semblais avoir lu que cet ordre était celui qui apparait dans la liste des frameworks dans le target. Mais apparemment c'est sans effet !

    Est-ce que quelqu'un sait comment forcer le chargement d'une framework, [bundle load] est sans effet et c'est probablement normal, car une framework est une librairie statique.
  • BruBru Membre
    09:34 modifié #5
    dans 1121502700:

    Et en plus il faut que la framework1 se charge avant la framework2, car celle-ci signale sa présence à  la framework1.
    Il me semblais avoir lu que cet ordre était celui qui apparait dans la liste des frameworks dans le target. Mais apparemment c'est sans effet !


    Faux !

    L'ordre de chargement des frameworks est déterminé par l'ordre dans lequel ils sont déclarés dans le target actif de ton projet, groupe "Link Binary With Libraries".

    Tu peux modifier l'ordre en glissant-déposant les frameworks entre eux.

    .

    [Fichier joint supprimé par l'administrateur]
  • BruBru Membre
    09:34 modifié #6
    dans 1121418636:
    t des frameworks.
    Dans une appli, j'utilise 2 frameworks, la séquence de chargement dans Tiger est la suivante:
    - chargement framework1
    - chargement framework2
    - chargement des nibs

    Jusque là  tout semble logique, mais dans Panther, j'ai pas la même chose:
    - chargement framework1
    - chargement des nibs
    - chargement framework2


    Une chose que je ne pige pas dans ton problème...

    Le chargement des frameworks au lancement d'une appli est dicté par le fichier Mach-O lui même, et donc se fait au chargement de celui-ci, c'est à  dire à  des millions de nano-secondes avant l'éventuel chargement du mainNib (dont le nom est dans info.plist), lui même dicté par la fonction NSApplicationMain du fichier main.c.

    Pour vérifier l'ordre de chargement des frameworks, tu peux, dans le terminal, faire un :
    [tt]otool -l /chemin-vers-le-fichier-Mach-O[/tt]
    (le fichier Mach-O de l'exécutable se localise dans le bundle de l'appli, répertoire Contents/MacOS/).
    Dans la section SECTION de SECTNAME "__symbols", segment SEGNAME "__LINKEDIT", tu trouveras les commandes "LC_LOAD_DYLIB" de chargement des bibliothèques/frameworks.

    .
  • BruBru Membre
    09:34 modifié #7
    dans 1121502700:

    Est-ce que quelqu'un sait comment forcer le chargement d'une framework, [bundle load] est sans effet et c'est probablement normal, car une framework est une librairie statique.


    Un framework est une library dynamique (c'est les applis qui sont "libraries" statiques).

    Pour charger des frameworks au runtime, je ne connais que la fonction du Core Foundation CFBundleLoadExecutable. Mais dans ton cas, je ne crois pas que cela soit utile (puisque, à  mon avis, les frameworks sont déjà  chargés en mémoire).

    .
  • mpergandmpergand Membre
    09:34 modifié #8
    salut bru,
    Un framework est une library dynamique (c'est les applis qui sont "libraries" statiques).

    C'est ce que pensait aussi, mais dans les paramètres de buit, j'ai static library (voir image jointe)

    En consultant la dev list Apple, il semble que le chargement s'effectue selon un mode "lazy", c'est à  dire que l'on ne peut pas prédire quand ce chargement aura lieu !

    [Fichier joint supprimé par l'administrateur]
  • mpergandmpergand Membre
    09:34 modifié #9
    Faux !

    L'ordre de chargement des frameworks est déterminé par l'ordre dans lequel ils sont déclarés dans le target actif de ton projet, groupe "Link Binary With Libraries".


    je ne dis pas le contraire, je dis simplement que ça ne marche pas chez moi, en fait j'avais fait un test il y a quelques temps et il me semblait que ça marchait et maintenemt ça marche plus ??? (même après un clean du projet)
  • BruBru Membre
    09:34 modifié #10
    dans 1121507235:

    C'est ce que pensait aussi, mais dans les paramètres de buit, j'ai static library (voir image jointe)


    Moi, voilà  ce que j'ai :

    [Fichier joint supprimé par l'administrateur]
  • mpergandmpergand Membre
    09:34 modifié #11
    En fait il ya deux possibilités:
    Framework -> static
    Dynamic Library -> dynamic

    Oui ?


    Plutôt logique, mais si je fais une librairie dynamique, il faut que je la charge à  la main ?
  • BruBru Membre
    09:34 modifié #12
    dans 1121507972:

    En fait il ya deux possibilités:
    Framework -> static
    Dynamic Library -> dynamic
    Oui ?
    Plutôt logique, mais si je fais une librairie dynamique, il faut que je la charge à  la main ?


    Non, tous les frameworks que j'ai fait sont dynamic, et sont chargés par dyld automatiquement au chargement de l'exécutable.

    .
  • mpergandmpergand Membre
    09:34 modifié #13
    Ok, mais justement, j'avais choisis static, car il me semblait que ces frameworks étaient chargées dès le démarrage de l'appli, alors que pour les dynamique, elles ne se chargent que lorsque l'appli appelle une de leurs méthodes.
  • BruBru Membre
    juillet 2005 modifié #14
    dans 1121508911:

    Ok, mais justement, j'avais choisis static, car il me semblait que ces frameworks étaient chargées dès le démarrage de l'appli, alors que pour les dynamique, elles ne se chargent que lorsque l'appli appelle une de leurs méthodes.


    Alors, pas d'accord.
    Le test est simple : créé un projet, ajoute-y un framework (sans l'utiliser dans le code).
    Ensuite,  déplace le framework vers un emplacement non-officiel.
    Lance ton appli : elle refusera de se lancer !

    Tu auras un message dans la console system.log du style :
    [tt]dyld: Library not loaded: @executable_path/../Frameworks/StuffIt.framework/Versions/A/StuffIt
      Referenced from: /Users/bruno/Programmation/Projets/test-SQLITEClasses/build/Release/test_SQLiteClasses.app/Contents/MacOS/test_SQLiteClasses
      Reason: image not found
    [/tt]
    .
  • mpergandmpergand Membre
    juillet 2005 modifié #15
    Merci, bru.

    Est-ce qu'il existe un mode verbose qui afficherait les libs chargées au démarrage de l'appli dans le terminal ?

    J'ai essayé otool, l'ordre correspond bien à  la list du projet, mais à  l'excution, ça semble pas être le même  ???

    Bon, en fait j'affiche un message dans la routine d'initialisation de mes frameworks, il semble logique que cette routine soit appellée juste après le chargement, mais alors je ne m'explique pas que si j'ai mis Framework2 framework1 dans cette ordre dans mon projet (et otools indique cette ordre aussi) les méthodes d'initialisations soient appellées dans l'ordre framework1 framework2 !!
Connectez-vous ou Inscrivez-vous pour répondre.