Compilation de C/C++ dans projet Obj C/Cocoa

LeChatNoirLeChatNoir Membre, Modérateur
17:46 modifié dans API AppKit #1
Salut,

Je me suis lancé dans le développement d'un client FTP (quand j'ai le temps).

Au départ, je passais par des NSTask pour utiliser le ftp de la ligne de commande Unix. Ca marche pas mal mais je me rend compte qu'il faudrait que je réinvente la roue en ce qui concerne la gestion des codes erreurs, la gestion des droits sur les fichiers etc, etc...

J'ai en effet trouvé 2 bibliothèques qui ont fait leurs preuves :
* ftplib et ftplib++.

Je tente donc de les intégrer dans mon application.
Après avoir identifié les plus gros pb de compilation (des header manquant en particulier), j'ai réussi à  compiler sans erreur dans un projet C/C++.

J'ai fait une bibliothèque que j'importe dans mon application Cocoa et là  bing. Ca me sort plein d'erreur genre symbole manquant etc...

J'ai tenté d'intégrer le code directement dans mon appli mais même pb...

Je ne comprend pas ces messages.
Qqu'un peut il m'aider ?




Réponses

  • ChachaChacha Membre
    août 2005 modifié #2
    Salut,

    Objective-C est un sur-ensemble du C, pas du C++. Mis à  part les mots-clefs et syntaxes nouvelles du C++, c'est surtout au linkage qu'il va y avoir une tripotée d'erreurs. En effet, les fonctions C++, notamment à  cause de la surcharge, n'ont pas la même signature que les fonctions C, donc la recherche des symboles dans les librairies est différente.
    Au final : on ne peut pas linker du C (ou de l'objective-C) avec du C++ sans travailler un peu.

    Solution 1)
    avec la directive <extern "C"> placée devant une fonction C++, on force le compilo à  lui attribuer une signature compatible avec le C. Le linkage marchera donc avec cette fonction. Ce n'est pas toujours possible (notamment en cas de fonctions surchargées, ou utilisant des objets dans le paramètre ou les types de retour)

    Solution 2)
    Transformer ton code C (resp. Objective-C) en C++ (resp. Objective-C++). ça, c'est facile : comme le C++ contient le C, et qu'Objective-C++ contient Objective-C, il suffit de changer l'extension du fichier
    .c -> .cpp
    .m -> .mm
    Et là  XCode se débrouille pour compiler dans le bon langage.
    Attention toutefois, si tu fais référence à  du code (Objective-)C++ dans une fichier .h, tous les fichiers .c (resp .m) qui l'incluent doivent être cplusplusifiés en .cpp (resp. .mm)

    Voilà 
    J'espère que c'était ça la question, sinon je me prends 2/20 pour hors sujet (ça s'est déjà  vu)

    +
    Chacha
  • LeChatNoirLeChatNoir Membre, Modérateur
    17:46 modifié #3
    Ben non, je te met pas 2/20 :-)
    C'est, je pense carrément le sujet.
    Je ferai des tests et vous tiendrai au courant.

    Mais je crois me souvenir avoir fait les tests avec du C (tout court) et de l'objective C (tout court) et c'était pas mieux.

    Mais ca remonte à  qques semaines et ca reste vague.

    Je me penche sur le truc dès que possible et vous donnerai des infos plus précises sur les éventuelles erreurs.

    Merci et a+

  • fouffouf Membre
    17:46 modifié #4
    dans 1124266639:

    [...]l'incluent doivent être cplusplusifiés en .cpp (resp. .mm)[...]

    ::) :P. J'aime bien, à  mettre dans le dico. N'est-ce pas Mr. Pivot ;)

    dans 1124266639:

    J'espère que c'était ça la question, sinon je me prends 2/20 pour hors sujet (ça s'est déjà  vu).

    He he , je suis plus fort que toi à  ce jeu la :fouf):
  • LeChatNoirLeChatNoir Membre, Modérateur
    17:46 modifié #5
    Re-salut,

    Bon je comprend pas très bien.

    J'ai 2 bibliothèques FTP : 1 en C standard et 1 en C++

    J'ai mis le code dans 2 projets de type "Static Cocoa library".

    Après qques modifs, les 2 projets compilent.

    Suite aux remarques de Chacha, je constate que l'utilisation du C++ est peut être pas une bonne ID. Je fais donc un peu de ménage (après qques mois de non programmation).

    Je vais dans mon appli cocoa et je mets un #include <ftplib.h> et il me met 15000 erreurs sur des pbs de syntaxe. Je constate que c'est des symboles présents dans la lib C++ qui déconnent. Pourtant, j'ai fais le ménage.
    Je suis donc aller dans les propriétés du target de mon application et j'ai indiqué d'aller chercher les bibliothèques ailleurs mais rien n'y fait...
    Je me demande où il va chercher ces bibliothèques puisque celle en c++, je l'ai virée (j'ai fait un clean all target) ?!

    Je suis un peu perdu là ....


    :(
  • fouffouf Membre
    17:46 modifié #6
    Le truc (je sais pas si tu l'as déjà  fait), c'est de changer les extensions de fichier en Objective-C. Tu les mets en .mm . Ainsi, le compilo, sais qu'il y a du C++ dans ton code. Sinon, il va compiler tes symboles comme si c'était du C et donc de sortir plein d'erreures. (Je répette peut-etre ce que dis Chacha, mais bon "Bis repetita placent" ;)
  • LeChatNoirLeChatNoir Membre, Modérateur
    17:46 modifié #7
    Salut Fouf,

    En fait je n'ai pas été très clair.

    J'avais compilé les 2 lib : 1 en C, 1 en C++.

    Suite aux conseils de Chacha, j'ai décidé de ne pas utiliser celle en C++ (c'est les mêmes en fait sauf qu'une est en C, l'autre en C++ ; à  l'époque, j'avais pris les 2 pour voir...).

    Donc mon appli est en Obj-C (donc extension .m) et ma lib est en C.

    Mais quand je compil mon appli, j'ai l'impression que le include va toujours chercher la lib en C++ !
    Mais je sais pas où il va la chercher ?

    Dans les options de compil, je lui indique d'aller chercher dans le build de ma lib C mais ca marche pas mieux...

    Qqu'un peut il m'expliquer comment on doit faire pour inclure une bibliothèque perso dans une appli Cocoa ?

    Merci !


  • ChachaChacha Membre
    17:46 modifié #8
    dans 1124352531:

    Mais quand je compil mon appli, j'ai l'impression que le include va toujours chercher la lib en C++ !
    Mais je sais pas où il va la chercher ?


    Salut,
    En fait, le mieux serait que tu postes le contenu de la console de compilation de XCode. Pour l'obtenir, voir ici : http://www.objective-cocoa.org/forum/index.php?topic=1006.msg11403#msg11403
    On verra un peu mieux de quoi il s'agit.

    +
    Chacha
  • LeChatNoirLeChatNoir Membre, Modérateur
    17:46 modifié #9
    Alors voilà  le résultat :
    Native Build of Target "ftp" using Build Style "Development"
    L'appli Cocoa en Obj-C s'appelle ftp.
    Le include de ftplib (la bibliothèque) est dans le module localBrowserCtrl.m
    Ce qui me fait dire qu'il continue à  aller chercher la lib en C++ c'est les erreurs sur ftphandle. En effet, ces variables n'existent que dans la lib C++.

    J'espère que ces traces vous suffisent ?
    Et merci d'avance !

    CompileC build/ftp.build/ftp.build/Objects-normal/ppc/localBrowserCtrl.o localBrowserCtrl.m normal ppc objective-c com.apple.compilers.gcc.4_0
        cd /Users/iGus/Documents/Devel/ftp
        /usr/bin/gcc-4.0 -x objective-c -arch ppc -pipe -Wno-trigraphs -fpascal-strings -fasm-blocks -g -O0 -Wreturn-type -Wunused-variable -fmessage-length=0 -fzero-link -mtune=G4 -mfix-and-continue -I/Users/iGus/Documents/Devel/ftp/build/ftp.build/ftp.build/ftp.hmap -F/Users/iGus/Documents/Devel/ftp/build -I/Users/iGus/Documents/Devel/ftp/build/include -I/Users/iGus/Documents/Devel/ftp/build/ftp.build/ftp.build/DerivedSources -include /Users/iGus/Documents/Devel/ftp/build/ftp.build/SharedCaches/ftp_Prefix-akraielyhgwkdrdgvrjuzuatmukq/ftp_Prefix.pch -c /Users/iGus/Documents/Devel/ftp/localBrowserCtrl.m -o /Users/iGus/Documents/Devel/ftp/build/ftp.build/ftp.build/Objects-normal/ppc/localBrowserCtrl.o
    In file included from /Users/iGus/Documents/Devel/ftp/localBrowserCtrl.m:11:
    /Users/iGus/Documents/Devel/ftp/ftplib.h:52: error: parse error before "namespace"
    /Users/iGus/Documents/Devel/ftp/ftplib.h:52: warning: data definition has no type or storage class
    /Users/iGus/Documents/Devel/ftp/ftplib.h:78: error: parse error before "ftphandle"
    /Users/iGus/Documents/Devel/ftp/ftplib.h:78: warning: no semicolon at end of struct or union
    /Users/iGus/Documents/Devel/ftp/ftplib.h:99: error: parse error before '}' token
    /Users/iGus/Documents/Devel/ftp/ftplib.h:101: error: parse error before "ftplib"
    /Users/iGus/Documents/Devel/ftp/ftplib.h:101: error: syntax error before '{' token
    /Users/iGus/Documents/Devel/ftp/ftplib.h:138: warning: data definition has no type or storage class
    /Users/iGus/Documents/Devel/ftp/ftplib.h:139: error: parse error before '~' token
    /Users/iGus/Documents/Devel/ftp/ftplib.h:153: error: parse error before "transfermode"
    /Users/iGus/Documents/Devel/ftp/ftplib.h:155: error: parse error before "transfermode"
    /Users/iGus/Documents/Devel/ftp/ftplib.h:156: error: parse error before "transfermode"
    /Users/iGus/Documents/Devel/ftp/ftplib.h:160: error: parse error before "enc"
    /Users/iGus/Documents/Devel/ftp/ftplib.h: In function 'SetCorrectPasv':
    /Users/iGus/Documents/Devel/ftp/ftplib.h:170: error: 'mp_ftphandle' undeclared (first use in this function)
    /Users/iGus/Documents/Devel/ftp/ftplib.h:170: error: (Each undeclared identifier is reported only once
    /Users/iGus/Documents/Devel/ftp/ftplib.h:170: error: for each function it appears in.)
    /Users/iGus/Documents/Devel/ftp/ftplib.h: At top level:
    /Users/iGus/Documents/Devel/ftp/ftplib.h:172: error: parse error before "mode"
    /Users/iGus/Documents/Devel/ftp/ftplib.h:173: error: parse error before '*' token
    /Users/iGus/Documents/Devel/ftp/ftplib.h:175: error: parse error before '*' token
    /Users/iGus/Documents/Devel/ftp/ftplib.h:175: error: parse error before "accesstype"
    /Users/iGus/Documents/Devel/ftp/ftplib.h:175: warning: data definition has no type or storage class
    /Users/iGus/Documents/Devel/ftp/ftplib.h:176: error: parse error before '*' token
    /Users/iGus/Documents/Devel/ftp/ftplib.h:177: error: parse error before "ftphandle"
    /Users/iGus/Documents/Devel/ftp/ftplib.h:178: error: parse error before "ftphandle"
    /Users/iGus/Documents/Devel/ftp/ftplib.h:180: error: parse error before ':' token
    /Users/iGus/Documents/Devel/ftp/ftplib.h:183: error: parse error before "ftphandle"
    /Users/iGus/Documents/Devel/ftp/ftplib.h:184: error: parse error before '*' token
    /Users/iGus/Documents/Devel/ftp/ftplib.h:185: error: parse error before "ftphandle"
    /Users/iGus/Documents/Devel/ftp/ftplib.h:186: error: parse error before '*' token
    /Users/iGus/Documents/Devel/ftp/ftplib.h:187: error: parse error before '*' token
    /Users/iGus/Documents/Devel/ftp/ftplib.h:188: error: parse error before "ftphandle"
    /Users/iGus/Documents/Devel/ftp/ftplib.h:189: error: parse error before "ftphandle"
    /Users/iGus/Documents/Devel/ftp/ftplib.h:190: error: parse error before "accesstype"
    /Users/iGus/Documents/Devel/ftp/ftplib.h:191: error: parse error before '*' token
    /Users/iGus/Documents/Devel/ftp/ftplib.h:193: error: parse error before '*' token
    /Users/iGus/Documents/Devel/ftp/ftplib.h:194: error: parse error before "ftphandle"
    /Users/iGus/Documents/Devel/ftp/ftplib.h:195: error: parse error before "ftphandle"
    /Users/iGus/Documents/Devel/ftp/ftplib.h:196: error: parse error before "ftphandle"
    /Users/iGus/Documents/Devel/ftp/ftplib.h:200: error: parse error before '}' token
    /Users/iGus/Documents/Devel/ftp/localBrowserCtrl.m: In function '-[localBrowserCtrl Go:]':
    /Users/iGus/Documents/Devel/ftp/localBrowserCtrl.m:116: warning: unused variable 'buff'
    /Users/iGus/Documents/Devel/ftp/localBrowserCtrl.m:81: warning: unused variable 'awkPgm'
    /Users/iGus/Documents/Devel/ftp/localBrowserCtrl.m:78: warning: unused variable 'maTache'


  • BruBru Membre
    17:46 modifié #10
    Juste une question :
    le fichier ftp.lib que tu inclues dans localBrowserCtrl.m se trouve dans un sous repertoire ftp dans ton projet.

    Or, ce fichier est il le bon (c'est à  dire celui de la lib C et non celui de la lib C++) ? Car le build result semble vouloir dire ça !

    .
  • ChachaChacha Membre
    17:46 modifié #11
    dans 1124355492:

    Or, ce fichier est il le bon ?


    J'en rajoute une couche : l'erreur
    /Users/iGus/Documents/Devel/ftp/ftplib.h:52: error: parse error before "namespace"
    Indique clairement que ftplib.h contient du C++

    +
    Chacha
  • LeChatNoirLeChatNoir Membre, Modérateur
    17:46 modifié #12
    Ok les gars,
    je suis un gros mauvais... :-\\
    En vous envoyant le résultat du build, je m'en suis aperçu.

    Donc j'ai viré le .h et ca a l'air d'être mieux. Je regarde ce soir (parce que c'est ma copine en fait qui a viré le .h et fait le build, je suis pas chez moi... Et elle me dit qu'il n'y a plus qu'une erreur mais elle sait pas faire gd chose en info...).

    Mais le bon .h (c-a-d celui en C), il faut que je le mette dans mon projet ? Dans le répertoire de mon projet comme l'autre ? Pas besoin de le mettre nul part ?

    En attendant, merci à  tous !
  • LeChatNoirLeChatNoir Membre, Modérateur
    17:46 modifié #13
    Bon alors voilà  l'erreur qu'il reste :
    il trouve pas le .h  <3 <br />
    Alors du coup, j'ai essayé d'importer la library (le .a généré dans le build de la library que j'ai compilée) mais c'est pas mieux...

    J'avoue que j'ai du mal à  trouver de la doc sur le sujet...

    Qqu'un pour m'aider ?
  • ChachaChacha Membre
    17:46 modifié #14
    dans 1124394429:

    Qqu'un pour m'aider ?


    Voui, je crois.
    J'ai cru comprendre que ta librairie était déjà  compilée (en .a). Vu que c'est un .a, c'est une librairie statique: ça veut dire qu'elle sera entièrement intégrée dans ton exécutable. Inconvénient : si tu la recompiles, tu dois relinker ton projet (ce n'est pas *dynamique*), Avantage dans ton cas : c'est plus simple, car tu n'as pas besoin de t'inquiéter de la disponibilté de la librairie chez les autres (je simplifie).
    Maintenant, tu as besoin d'un .h, car pour utiliser les fonctions de la librairie, tu dois bien informer ton code à  toi de quels symboles elle contient, et comment les appeler (grâce au prototype).
    Tu devrais donc inclure le .h dans ton projet.
    Mais de deux choses l'une : soit tu as dupliqué le .h dans ton répertoire de projet à  toi (auquel cas ça devrait marcher), soit non, auquel cas il faut effectivement donner au compilo le chemin du .h en question (grâce aux "Header search path" de l'inspecteur de propriétés de compil).
    Dans le doute, tu peux poster le log de compil ?

    +
    Chacha
  • LeChatNoirLeChatNoir Membre, Modérateur
    17:46 modifié #15
    Ok merci bcp.

    En fait, il me semblait que tout était dans l'archive...
    Y compris le .h

    Mais bon je me gourre sans doute.
    Je fais ça.
    Merci !
  • ChachaChacha Membre
    17:46 modifié #16
    dans 1124396256:

    En fait, il me semblait que tout était dans l'archive...
    Y compris le .h

    Et non, c'est pas comme un framework ! Par contre, un framework, en plus de contenir des headers et diverses resources, contient (au moins une) librairie (dynamique). C'est quand même une belle invention, les frameworks !
  • LeChatNoirLeChatNoir Membre, Modérateur
    17:46 modifié #17
    Ok ben ca marche bien.
    Merci à  tous !!!
Connectez-vous ou Inscrivez-vous pour répondre.