IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Impossible de compiler un bête helloworld !


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 131
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 131
    Par défaut Impossible de compiler un bête helloworld !
    Bonsoir,

    je vais péter un plomb ! C'est à peine plus sophistiqué qu'un helloworld, le machin fait 43 lignes...

    Il commence comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <stdio.h>
    #include <ftdi.h>
    dans le main on trouve des choses genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        int ret;
        struct ftdi_context ftdic;
        if ((ret = ftdi_usb_open(&ftdic, 0x0403, 0x6001)) < 0)
    dans le .h on trouve son pendant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        int ftdi_usb_open(struct ftdi_context *ftdi, int vendor, int product);
    j'ai vérifié (vous allez voir pourquoi juste après) que j'avais bien les 2 .h au bon endroit (je suis sous Linux, donc "locate" me donne l'emplacement d'un fichier) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # locate stdio.h
    /usr/include/stdio.h
     
    # locate ftdi.h
    /usr/include/ftdi.h
    et le .c vient d'un paquet téléchargé depuis les dépots officiels de Debian, donc aucune bidouille de ma part.

    Malheureusement, avec tout ça de positif, quand j'ouvre le .c dans Geany et que j'appuie sur F8, si la compilation est réussie (génération d'un .o), quand j'appuie sur F9 la création échoue avec des trucs genre simple.c:(.text+0x60): undefined reference to `ftdi_usb_open'
    J'avais testé avant avec gcc -Wall simple.c -o simple, qui me sortait le même résultat lamentable

    Si quelqu'un a une idée, je la lirai avec grand plaisir parce que là, c'est la première fois que je vois un truc pareil...

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 771
    Par défaut
    Oui très simple

    Soit:
    • il te manque un "-lftdi" lorsque tu "linkes" (lies) (*)
    • il faut faire une librairie statique: tu crées un nouveau projet pour avoir une bibliothèque .a (ou .so, je confonds sous Linux ) et l'utiliser lors du "linkage" (liaison)
    • il faut faire une librairie statique en mode bourrin, en compilant en plus du source simple.c, toutes les sources de cette bibliothèque



    * -> Édit: je me suis gouré c'est l minuscule pour la bibliothèque

  3. #3
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 131
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 131
    Par défaut
    Mais tu es partout
    Citation Envoyé par foetus Voir le message
    Oui très simple
    Pour tout le monde, jamais pour moi

    Citation Envoyé par foetus Voir le message
    • il te manque un "-Lftdi" lorsque tu "linkes" (lies)
    Même erreur...

    Citation Envoyé par foetus Voir le message
    • il faut faire une librairie statique: tu crées un nouveau projet pour avoir une bibliothèque .a (ou .so, je confonds sous Linux ) et l'utiliser lors du "linkage" (liaison)
    Comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gcc -Wall -static -o ftdi.a /usr/include/ftdi.h
    gcc -Wall -Lftdi.a -o simple simple.c
    Même erreur

    Citation Envoyé par foetus Voir le message
    • il faut faire une librairie statique en mode bourrin, en compilant en plus du source simple.c, toutes les sources de cette bibliothèque
    Je ne vois pas la différence avec le point précédent...

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 771
    Par défaut
    Tu ne comprends pas ce que tu fais ou

    Parce que le source se trouve dans le fichier ftdi.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int ftdi_usb_open(struct ftdi_context *ftdi, int vendor, int product)
    {
        return ftdi_usb_open_desc(ftdi, vendor, product, NULL, NULL);
    }


    gcc -Wall -Lftdi.a -o simple simple.c.
    Je ne sais pas parce qu'il ne faut pas mettre l'extension. Avec l'extension je ne sais pas ce que fait gcc
    Mais en théorie lorsque tu fais un un "-lXXX", gcc va chercher dans "ces chemins" un fichier "libXXX.a"

    Est-ce que tu as installé cette bibliothèque avec "./configure; make; make install" ?
    À l'époque cela me gonflait grave que chaque installation finissait dans le dossier "/usr/" (/usr/lib, /usr/include, ...), qui n'était pas dans "les chemins" de gcc
    Donc plus un gcc -Wall -lftdi -L/usr/lib/ -o simple simple.c.


    Édit: je me suis gouré c'est l minuscule pour la bibliothèque


    Sinon c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    gcc -c main.c
    gcc -c ftdi.c
    gcc -c ftdi_stream.c
    gcc -o simple main.o ftdi.o ftdi_stream.o

    Citation Envoyé par Jipété Voir le message
    Je ne vois pas la différence avec le point précédent...
    Normal, c'est 3 fois la même chose, mais pas la même façon de faire

  5. #5
    Membre Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Bonjour,

    quand on utilise une bibliothèque externe (ce qui semble être ton cas) il faut savoir plusieurs choses :

    • il faut donner au préprocesseur le chemin où il va trouver les headers, cela se fait via l'option -I suivi du chemin pour gcc
    • il faut donner à l'éditeur des liens le chemin où trouver les bibliothèques et les bibliothèques, cela se fait via les options -L suivi du chemin et -l (une bibliothèque nommée libftdi.so donne l'option -lftdi) si les bibliothèques sont dynamiques.


    Il faut ensuite se référer à la documentation de ton compilateur pour savoir quelles options utiliser, voire de ton IDE pour savoir comment les lui transmettre. Il faut aussi se référer à la doc de la bibliothèque pour vérifier qu'elle n'offre pas un moyen simple pour récupérer les chemins (par exemple via pkg-config sous linux).

    Je ne peux que te recommander d'utiliser un gestionnaire de projet (make ou autre …) qui te simplifiera grandement la vie.

  6. #6
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 131
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 131
    Par défaut
    Citation Envoyé par picodev Voir le message
    Il faut ensuite se référer à la documentation de ton compilateur pour savoir quelles options utiliser, voire de ton IDE pour savoir comment les lui transmettre. Il faut aussi se référer à la doc de la bibliothèque pour vérifier qu'elle n'offre pas un moyen simple pour récupérer les chemins (par exemple via pkg-config sous linux).

    Je ne peux que te recommander d'utiliser un gestionnaire de projet (make ou autre …) qui te simplifiera grandement la vie.
    Beaucoup de travail et de trafic et d'études pour trois misérables .c, le jeu n'en vaut pas la chandelle mais merci quand même d'avoir participé.

    Citation Envoyé par foetus Voir le message
    Tu ne comprends pas ce que tu fais ou

    Parce que le source se trouve dans le fichier ftdi.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int ftdi_usb_open(struct ftdi_context *ftdi, int vendor, int product)
    {
        return ftdi_usb_open_desc(ftdi, vendor, product, NULL, NULL);
    }
    Et toi tu lis trop vite,

    Mais vu autrement, est-ce que vous vous prenez la tête quand vous avez au début de votre test.c qqchse genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <stdio.h>
    #include <time.h>
    Hé bien là, dans le cas qui a suscité ce post c'était #include <ftdi.h> à la place de #include <time.h> et le compilo était censé aller chercher au même endroit, dans /usr/include/. Je ne vois vraiment pas ce qui a cloché sur ce coup-là...
    Car quand je compile un test.c je n'ai pas besoin de générer avant un time.a ou un time.so, or, pour le compilateur, que le fichier s'appelle /usr/include/time.h ou /usr/include/ftdi.h, c'est pareil, non ?

    'fin bon, l'un dans l'autre je m'en suis sorti comme ça :
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gcc -Wall -L. -o ftdi.so /usr/include/ftdi.h
    gcc -Wall -lftdi -L. -o simple simple.c

    Citation Envoyé par foetus Voir le message
    Est-ce que tu as installé cette bibliothèque avec "./configure; make; make install" ?
    Que dalle ! Synaptic pour installer libftdi-dev et j'ai ensuite découvert un dossier examples où je suis allé fouiller

    Citation Envoyé par foetus Voir le message
    Édit: je me suis gouré c'est l minuscule pour la bibliothèque
    Ah ben vi. Tu m'étonnes que je m'arrête contre un platane si tu me scies les freins

    Merci à tous,

  7. #7
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 771
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Hé bien là, dans le cas qui a suscité ce post c'était #include <ftdi.h> à la place de #include <time.h> et le compilo était censé aller chercher au même endroit, dans /usr/include/. Je ne vois vraiment pas ce qui a cloché sur ce coup-là...
    Car quand je compile un test.c je n'ai pas besoin de générer avant un time.a ou un time.so, or, pour le compilateur, que le fichier s'appelle /usr/include/time.h ou /usr/include/ftdi.h, c'est pareil, non ?
    Tu vois que tu captes que dalle

    Parce que time fait parti de la bibliothèque standard et est livré avec le compilateur. Sa page officielle et Sa page wiki

    Ton problème est bien l'emplacement des fichiers .a/ .so (que tu as compilé comme un bourrin à la racine )

    D'ailleurs, il me semble que lorsque tu installes les paquets devel, tu installes que les .h et non pas les .a/ .so

    Édit: j'ai perdu le paquet devel installe "/usr/lib/libftdi1.so" (ici)

    Édit: Donc plus un gcc -lftdi1 -o simple simple.c.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Impossible de compiler un projet avec #include <glib.h>
    Par canard75 dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 14/12/2005, 18h18
  2. Jbuilder2006 impossible de compiler mon projet
    Par danje dans le forum JBuilder
    Réponses: 4
    Dernier message: 01/11/2005, 23h32
  3. [devc++]Impossible de compiler !!!
    Par insomniak dans le forum Dev-C++
    Réponses: 11
    Dernier message: 24/10/2005, 13h38
  4. [Dev-cpp] Impossible de compiler le projet !
    Par Franck.H dans le forum Dev-C++
    Réponses: 5
    Dernier message: 18/10/2005, 11h55
  5. [JOnAS][JOPE] impossible de compiler un bean
    Par Raylemon dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 05/04/2005, 16h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo