Fichier .c dans un projet Objective-C

Je ne vois pas comment faire pour inclure des fichiers .c dans un projet Objective-C.

Chaque fois que j'introduis un fichier .c et son .h dans mon projet, j'obtiens plus de 11000 erreurs. Plus curieus, les erreurs sont trouvées dans les .h des bibliothèques.

Si je transforme le .c en .m en mettant les routines dans une implémentation et en modifiant le .h pour avoir la déclaration @interface correspondante, plus d'erreur et le programme tourne correctement.

J'ai vérifié dans les "Build settings" que "Compile sources As" = "According to file type".

Donc, il y a quelque chose que je ne comprends pas!

Ou est-ce que je me plante?

Réponses

  • mpergandmpergand Membre
    décembre 2012 modifié #2
    Multi-inclusions ?



    Dans le .h il faut faire :





    #ifndef _NOM_FICHIER_

    #define _NOM_FICHIER_



    // déclarations ici



    #endif
  • tabliertablier Membre
    décembre 2012 modifié #3
    J'ai déjà  ça:
    #ifndef SLOSYN_H_INCLUDED

    #define SLOSYN_H_INCLUDED



    ........ include et déclarations en c



    #endif
    J'ai cherché sur google. Beaucoup posent la même question, mais Je n'ai pas trouvé de réponse.

    J'ai bien une idée, mais je ne sais pas comment on fait ça. L'idée serait de compiler séparément le fichier .c et de joindre le fichier .o au moment du linkage. Si quelqu'un a un exemple, je prends (je sais, c'est pas beau de copier!!).
  • Si tu inclus des fichiers .c dans des fichiers qui contiennes de l'objective-c tu dois renommer les fichiers en .mm, ca indique au compilateur comment les gérer.
  • 'igreg' a écrit:


    Si tu inclus des fichiers .c dans des fichiers qui contiennes de l'objective-c tu dois renommer les fichiers en .mm, ca indique au compilateur comment les gérer.




    Pour le C++ uniquement.



    Sinon, c'est quoi cette librairie ?
  • tabliertablier Membre
    décembre 2012 modifié #6
    Ce n'est pas une librairie. C'est un fichier source en C que je veux ajouter dans un projet Objective-C. Donc, il faut le compiler, puis le lier avec les autres .o. A noter que c'est un vrai fichier C. Pas de C++ ou d'objective-C dedans.

    Une librairie statique qui vient du C compilé, j'en ai ajouté une dans les "Frameworks", ça ne pose aucun problème. Il suffit d'ajouter l'import de son .h aux bons endroits et ça marche.
  • AliGatorAliGator Membre, Modérateur
    C'est bizarre car normalement ça ne pose aucun problème.



    Que se passe-t-il si tu renommes le ".c" en ".m", mais sans changer son contenu ?

    Car dans un .m on peut mettre de l'Objective-C, mais aussi du C "pur". Donc si ton fichier a une extension ".m" mais ne contient que du C comme actuellement, même s'il ne contient aucune ligne d'Objective-C, ça devrait compiler.

    Ca n'expliquerait pas pourquoi avec l'extension ".c" ça ne compile pas ceci dit, mais si changer l'extension suffit c'est déjà  un bon début...



    Ca ressemble à  quoi sinon les erreurs que tu as si tu mets le .c dans le projet sans changer son extension ? Elles sont à  peu près toutes du même type ?
  • tabliertablier Membre
    décembre 2012 modifié #8
    Les erreurs que j'ai sont fort curieuses: Des erreurs de syntaxe dans les .h des bibliothèques de Cocoa comme dans l'image ci-dessous, normalement c'est impossible. Donc, il y a quelque chose que je n'ai pas compris!

    Description du projet:Projet Objective-C qui doit faire fonctionner un lecteur de ruban à  travers une connexion USB. Donc, un Pic programmé et placé dans la machine.

    Dans le groupe "Frameworks" j'inclus la LibUSB.

    Dans les sources j'ajoute le usb.h de la LibUSB, ainsi qu'un fichier .c et son .h. Ces fichiers comportent des fonctions de gestion globales du lecteur SloSyn, qui sont:
    void slosyn_cleanup(void);

    int find_slosyn_device(void)

    slosyn_error_t slosyn_initialize(void);

    slosyn_error_t slosyn_open(slosyn_handle_t**);

    void slosyn_close(slosyn_handle_t*);

    slosyn_error_t slosyn_get_state(slosyn_handle_t*, slosyn_bitmap_t*);

    slosyn_error_t slosyn_read_chars(slosyn_handle_t*, unsigned int, uint8_t*, size_t*);
    Par ailleurs, ces fichiers .c et .h utilisés dans une application en ligne de commande, marchent très bien.

  • AliGatorAliGator Membre, Modérateur
    C'est peut-être à  cause du fichier Prefix.pch



    Ce fichier est inclus automatiquement au début de tous tes fichiers source avant que le compilateur les compile.

    (Comme si tu avais fait #import "Prefix.pch" au début de tous tes fichiers .c et .m)



    Or si les fichiers inclus dans ton PCH comportent des instructions Objective-C, comme @class ou @interface ou des choses comprises uniquement par un compilateur Objective-C et pas un compilateur C, alors forcément la compilation de ton fichier C par le compilateur C ne va pas aimer.



    Tu es sûr que dans ton .PCH tu as bien tes #imports de <Foundation/Foundation.h> & co entre #if __OBJC__ par exemple ?
  • Aà¯e je n'ai pas pensé à  cela. Je vais vérifier ce que j'ai mis dans le .PCH.
Connectez-vous ou Inscrivez-vous pour répondre.