Séquence de chargement différrent entre Tiger et Panther
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Â
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Â

Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Oui.
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.
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]
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.
.
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).
.
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]
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)
Moi, voilà ce que j'ai :
[Fichier joint supprimé par l'administrateur]
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.
.
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]
.
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 !!