# Systmes > Apple > Dveloppement iOS >  dynamic library pour iOS

## joachimzz

Bonjour tout le monde,

Est ce que vous savez comment crer un .dylib pour iOS?

En fait, je veux crer un .dylib et ensuite lorsqu'il est sur le tlphone le lire avec la mthode dlopen (page d'utilisation de dlopen).

Aujourd'hui, j'ai cet erreur quand j'utilise dlopen():



```

```

Je pense que c'est du au fait que la dylib n'est pas compiler pour iOS mais pour Mac (c'est mme sr). Donc voil il faudrait juste que je sache si il est possible de compiler une dylib pour iOS et comment faire.

Merci d'avance, bonne soire.

----------


## JeitEmgie

RTFM :




> "The iOS SDK supports the creation of native applications that appear on the devices Home screen only. It does not support the creation of other types of code, such as drivers, frameworks, or dynamic libraries. If you want to integrate code from a framework or dynamic library into your application, you should link that code statically into your applications executable file when building your project."


En clair :

S'il est techniquement possible de faire une dylib pour iOS (puisque les frameworks de l'OS ne sont rien d'autre que cela), vous devez faire une librairie statique : mme si vous arriviez  contourner le problme sur votre device personnel, votre application sera rejete par le systme d'approbation si elle charge dynamiquement du code autre que les frameworks de iOS.

----------


## joachimzz

Merci pour cette rponse!!! 

En fait je crois que vous avez mal compris ce que je veux faire (jai du mal expliqu)!!! Je veux juste crer un .dylib, puis le compiler pour iOS. C'est la deuxime phase qui pose problme, je ne sais pas comment configurer XCode pour le faire. Normalement a doit tre possible car les bibliothques qu'on utilise dans nos codes sont des des dylib mais je ne sais pas comment (je ne suis pas un expert d'XCode).

La raison pour laquelle je veux le faire n'est pas du tout commerciale, c'est juste des tests. Plus exactement, on essaie de voir si il est possible d'importer Celix sur iOS. Le but est de simplement trouver les limites de cette importation. 

Enfin pour rpondre  ce qui est dit sur le "manuel", nos dylib ne doivent pas tre lis au projet. Il faut les utiliser comme un simple fichier qu'on traiterait avec dlopen(). 

Merci d'avance pour vos futures rponses!!!

----------


## JeitEmgie

Dans XCode, choisir comme template iOS:Library:Cocoa Touch Static Library
Une fois le projet cr, aller dans les settings du projet, partie Linking et changer le Mach-O type en "Dynamic Library", 
dans les settings de la Target : changer l'extension du produit de "a" en "dylib"

Il compilera mais il peut faire une erreur sur la liaison du fichier des symboles pour le debugging.
Pour que dlopen fonctionne sur l'iPhone, il est impratif que la dylib soit aussi signe avec un certificat.
Pour mettre la dylib sur le device, il faudra la mettre dans les ressources (comme si c'tait une image) de l'application hte.

----------


## joachimzz

Oki merci bien. Je testerai a demain au travail.

----------


## joachimzz

Bonjour, voil j'ai fait ce que vous avez dit mais j'ai du louper une tape!!!!

Voil ce que j'ai  l'excution:



```

```

J'ai russi  crer la dylib, la mettre sur le tlphone mais il n'arrive pas  l'ouvrir!!! Normalement pour la compilation de la dylib j'ai bien mis les bons paramtres (version d'iOS, mon certificat ...).

Est ce que vous avez une ide??

----------


## JeitEmgie

Avez-vous bien mis la version "Release" de la dylib : celle pour l'iPhone et non celle pour le simulateur ?
(vous devriez avoir une librairie FAT arm6/arm7)

----------


## joachimzz

Oui j'ai bien utilis la version release pour le device et non l'emulateur

dans Architectures j'ai :

Architectures : Standard (armv6 armv7)
Base SDK : Latest (iOS 4.3)
Valid Architectures : armv6 armv7

dans Linking: 

Match-O Type : Dynamic Library

Et j'ai bien mis mon certificat pour signer la librairie

Aprs je ne vois pas trop ce qu'il y aurait d'autre  modifier.

----------


## joachimzz

Pour la compilation: 

Je compile avec les options suivantes : device, release, armv6

Et dans le message prcdent j'ai oubli de dire que je choisissais dans les infos du projet pour iOS Deployment Target: iOS 4.2. C'est la version de mon iPhone

----------


## JeitEmgie

> Oui j'ai bien utilis la version release pour le device et non l'emulateur


entre ce que vous dites et ce que vous faites

les bytes
213C617263683E0A
c'est en ASCII
!<arch>
une librairie signe pour arm6/arm7  commence par les bytes 
CAFEBABE (en hexa)
le !<arch> apparat plus loin   l'offset 48

----------


## joachimzz

Oki merci pour l'explication. J'avoue que j'avais beaucoup de mal  comprendre ce que a voulait dire ces bits. Je vais essayer de voir ce qui ne va pas

----------


## joachimzz

J'essaie de voir mais je ne vois pas du tout ce qui ne va pas. 

Est ce que vous pouvez m'expliquer ce que veut dire !<arch> dans votre prcdent message svp??

Pour signer la librarie il faut bien que j'utilise mon compte dveloppeur iPhone??

----------


## JeitEmgie

> J'essaie de voir mais je ne vois pas du tout ce qui ne va pas. 
> 
> Est ce que vous pouvez m'expliquer ce que veut dire !<arch> dans votre prcdent message svp??
> 
> Pour signer la librarie il faut bien que j'utilise mon compte dveloppeur iPhone??


!<arch> c'est la valeur en ASCII des bytes 0x21 0x3C 0x61 0x72 0x63 0x68 0x3E
qui apparaissent dans le message d'erreur se plaignant du format du fichier 
une librairie Arm signe commence par les bytes 0xCA 0xFE 0xBA 0xBE

donc le message d'erreur est normal : vous ne transfrez pas sur l'iPhone le bon fichier dylib.

Pour signer un excutable pour la phase de tests sur votre propre iPhone vous utilisez le certificat li  votre "provisioning profile" mais ni le certificat "Adhoc" ni le certificat de distribution.

----------


## joachimzz

Oki merci pour la rponse.

Pour la signer il suffit de slectionner son compte developer dans Code Signing -> Code Signing Idendity???

Le fichier .dylib  mettre dans mon projet se trouve bien dans Release-iphoneos???

----------


## JeitEmgie

> Oki merci pour la rponse.
> 
> Pour la signer il suffit de slectionner son compte developer dans Code Signing -> Code Signing Idendity???


oui mais le "bon" profil : pas celui qui sert  publier sur l'AppStore, celui de "provisioning", si vous n'avez pas oubli de le crer dans votre compte iTunes : sinon il faut y retourner pour crer une profil de "provisioning" qui ne sert qu' signer les applications que l'on teste sur ses propres machines





> Le fichier .dylib  mettre dans mon projet se trouve bien dans Release-iphoneos???


oui
et vrifiez avec hexdump qu'il commence bien par CAFEBABE

----------


## Marcos Ickx

> Oui j'ai bien utilis la version release pour le device et non l'emulateur
> 
> dans Architectures j'ai :
> 
> Architectures : Standard (armv6 armv7)
> Base SDK : Latest (iOS 4.3)
> Valid Architectures : armv6 armv7
> 
> dans Linking: 
> ...





> Pour la compilation: 
> 
> Je compile avec les options suivantes : device, release, armv6
> 
> Et dans le message prcdent j'ai oubli de dire que je choisissais dans les infos du projet pour iOS Deployment Target: iOS 4.2. C'est la version de mon iPhone


Est ce logique d'indiquer dans XCode que le SDK utilis pour votre application soit iOS 4.3, pour dployer ensuite sur un iPhone quip uniquement de iOS 4.2 ? ::koi::

----------


## joachimzz

Moi non plus je trouve pas a logique!!! mais je n'ai jamais eu de problme.

@ JeitEmgie merci je vais essayer de voir ce qui me manque!! Merci aussi pour le nom du logiciel

----------


## joachimzz

Re bonjour!!!

Voil, j'ai fait un nouveau projet pour recrer ma dylib. Avec la commande hexdump je vrifie que le fichier est bon. Normalement il l'est, j'ai cette ligne :

0000000 ca fe ba be 00 00 00 02 00 00 00 0c 00 00 00 06

Le problme maintenant, lorsque j'essaie de l'ouvrir sur l'iPhone, il me donne la mme erreur que prcdemment:




> dlopen(/var/mobile/Applications/388AA889-7359-43B5-86AB-55BA960F2DC2/Documents/.cache/bundle1/version0.0/libHelloWorld5.dylib, 2): no suitable image found.  Did find:
> 	/var/mobile/Applications/388AA889-7359-43B5-86AB-55BA960F2DC2/Documents/.cache/bundle1/version0.0/libHelloWorld5.dylib: unknown file type, first eight bytes: 0x21 0x3C 0x61 0x72 0x63 0x68 0x3E 0x0A
> 	/var/mobile/Applications/388AA889-7359-43B5-86AB-55BA960F2DC2/Documents/.cache/bundle1/version0.0/libHelloWorld5.dylib: stat() failed with errno=-1



En fait on dirait que la dylib finale contient deux dylib, une pour armv6 et l'autre pour armv7. 
Quand je vais dans les dossiers gnrs: nomProjet.build/Release-iphoneos/NomProjet.build/Objects-normal/ il y a deux dossiers armv6 et armv7.
Dans chacun des dossiers, il y a ma librairie gnre et quand je leur applique la commande hexdump il me donne la ligne:

0000000 21 3c 61 72 63 68 3e 0a 23 31 2f 32 30 20 20 20

Donc en fait quand dlopen se lance, je pense qu'il arrive pas  ouvrir la dylib qui est contenue dans ma dylib finale!!!

----------


## JeitEmgie

> Donc en fait quand dlopen se lance, je pense qu'il arrive pas  ouvrir la dylib qui est contenue dans ma dylib finale!!!


pas du tout : il n'a rien  faire  chercher votre dylib dans un .cache !
ce qui signifie sans doute que quand vous avez ajout la dylib  votre projet, il a dtect que c'tait du code et l'ajoute aux options de link
ce qui videmment il ne faut pas faire : vrifiez que dans le Link Binary With Libraries de la Target la dylib n'est PAS dans la liste des fichiers 
mais que par contre elle est bien dans Copy Bundle Resources : il suffit de la dragger de l'un dans l'autre

----------


## joachimzz

Je l'ai bien mis dans copy bundle ressources!!!

----------


## JeitEmgie

> Je l'ai bien mis dans copy bundle ressources!!!


il n'est pas cens trouver votre dylib dans .cache et s'il y trouve quelque chose c'est que  un moment donn vous avez li votre projet  cette dylib et install tel quel sur l'iPhone du coup il a copi cette dylib dans la cache de code et dlopen va continuer  la trouver sur son chemin
tant que vous ne lui donnez pas un autre nom ou tant que vous ne restaurez pas l'iPhone, vous allez avoir le problme


j'ai fait un essai ici avec l'exemple HelloWorld :
et ce que j'obtiens c'est :


```

```

il est  parier que la sandbox bloque les accs au fichier puisque l'erreur se produit sur le stat() lors de l'ouverture du fichier
(voir http://opensource.apple.com/source/d...3/src/dyld.cpp)

----------


## joachimzz

Ou est ce que vous voyez que j'ouvre la dylib dans le .cache?? Si c'est dans l'adresse qui est donn dans mes erreurs, c'est normal c'est moi qui le met l (c'est le systme de fichier qui est cre par celix). 

J'ai refait un projet qui appelle juste dlopen avec un dylib bidon et a me donne toujours la mme erreur alors qu'elle est signe.



```

```

Avec la commande hexdump sur la librairie j'ai a:



```

```

La j'arrive mme pas  avoir la mme chose que vous!!!

----------


## joachimzz

Je viens de remarquer un truc, lorsque je compile ma librarie sans mettre de certificat pour signer (je laisse code singning idendity vide), aprs la compilation lorsque je lance la commande hexdump a me fait a:



```

```

----------


## JeitEmgie

Une solution :

http://sumgroup.wikispaces.com/iPhone_Dynamic_Library

Une autre :

Pour crer la dylib, vous crer un nouveau projet bas sur le template Mac OS X:Framework & Library:Bundle

Vous ajoutez vos sources,
vous modifiez le Base SDK pour celui de l'iPhone et tout ce qui doit l'tre pour l'iPhone
une fois le build russi, dans le dossier build du projet du bundle, vous ouvrez le bundle lui-mme et copiez le fichier qui contient le code
c'est lui la "bonne" dylib : vous n'avez plus qu' l'ajouter  votre projet en lui donnant le bon nom et la bonne extension (optionnel)

et



```

```

donne 



```

```

(ma fonction test de la dylib tant :


```

```

)

notez aussi que rien ne devrait vous empcher de mettre dans votre projet iPhone le bundle complet et utiliser les fonctions de NSBundle ou CFBundle pour charger le plug-in

----------


## joachimzz

Oki merci. J'ai juste une question conne!!! comment ouvre-t'on un .bundle??

----------


## JeitEmgie

> Oki merci. J'ai juste une question conne!!! comment ouvre-t'on un .bundle??


clic droit dans le Finder : "Afficher le contenu du paquet"

mais encore plus simple :



```

```

dans votre projet principal vous incluez le(s) projet(s) qui construi(sen)t le(s) bundle(s), 
(vous ouvrez les 2 projets et vous ajoutez celui du bundle  celui de l'application par drag and drop de son icone bleue dans la la liste Groups and Files)

vous ouvrez le projet du bundle ainsi inclus en cliquant sur son triangle dans la outline view et vous ajoutez le .bundle dans la Copy Bundle Resource phase

le gros avantage tant qu'en faisant ainsi, Xcode va automatiquement copier dans le produit final la bonne version du bundle et vous pourrez tester aussi bien sur le Simulateur que sur l'iPhone sans aucun souci 
ce qui n'est pas du tout le cas en extrayant  la main les dylibs : soit vous aurez celle du simulateur soit celle de l'iPhone mais jamais la bonne automatiquement.

----------


## joachimzz

Pour la question conne!!!!! c'tait bon en fait (je suis vraiment fatigu)

Sinon c'est bon pour la dylib a marche nikel.

Je vous remercie vraiment. Je pense que j'aurais vraiment galr tout seul pour trouver et surtout merci pour les explications j'en avais besoin!!!!

Demain je testerai votre dernier code.

Je reviendrai srement trs vite lol.

----------

