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 :

Erreur "undefined reference to" alors que j'ai importé ma librairie


Sujet :

C

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 171
    Par défaut Erreur "undefined reference to" alors que j'ai importé ma librairie
    Bonjour, lorsque j'essaie d'appeler une fonction dans mon code, j'obtiens l'erreur "undefined reference to 'leNomDeLaFonction'".

    Cependant j'ai bien importé la librairie correspondante, et je me sers deja de cette fonction ailleurs dans mon code.

    Sur la ligne en rouge j'obtiens l'erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    void StartReception(void)
    {
      pBufferReadyForReception = aRXBufferA;
      pBufferReadyForUser      = aRXBufferB;
      uwNbReceivedChars = 0;
      uwBufferReadyIndication = 0;
    
      /* Print user info on PC com port */
      PrintInfo(aTextInfoStart, sizeof(aTextInfoStart));
      LL_mDelay(100);
    
      LL_USART_ClearFlag_ORE(USARTx_INSTANCE);
    
      /* Enable RXNE and Error interrupts */
      LL_USART_EnableIT_RXNE(USARTx_INSTANCE);
      LL_USART_EnableIT_ERROR(USARTx_INSTANCE);
    }
    Alors que par exemple pour cette fonction la je n'ai pas d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void LED_Blinking(uint32_t Period)
    {
      /* Toggle LED2 in an infinite loop */
      while (1)
      {
        LL_GPIO_TogglePin(LED2_GPIO_PORT, LED2_PIN);  
        LL_mDelay(Period);
      }
    }
    Et les deux sont dans le meme code dans le meme fichier

  2. #2
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    « Importer » est un terme vide de sens en C, que voulais-tu dire ? As-tu précisé le chemin vers la bibliothèque en question auprès de l'éditeur de liens ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 171
    Par défaut
    Je sais pas comment le dire mais j'ai bien mis cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include "stm32l1xx_ll_utils.h"
    Sauf que je peux me servir des fonctions présentent dans ce .h seulement dans certaines fonctions de mon .c, par exemple dans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void LED_Blinking(uint32_t Period)
    ca fonctionne mais dans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void StartReception(void)
    ca ne fonctionne pas.

    En attendant j'ai utilise un autre timer directement dans mon main donc ca ne me pose plus de soucis mais c'est quand meme etrange comme comportement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (1)
      {
    	  StartReception();
    	  HAL_Delay(5000);
    }

  4. #4
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    551
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 551
    Par défaut
    Bonjour,
    C'est une erreur qui veut dire que vous n'avez pas fourni à votre compilateur du moins annoncé à votre compilateur que vous utilisez une bibliothèque X (la librairie qui va avec vos fichiers d’en-tête). Plus précisément vous utiliser les fichiers en-têtes sans pour autant effectuer un lien (-lxxxx) avec la bibliothèque et donc pas d'entrer dans la table de symboles.
    Pour remédier à cela, il vous faut compiler vos sources avec la bibliothèque fournie.

    À bientôt.

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 171
    Par défaut
    Dans ce cas comment expliquer que l'erreur ne se produise qu'a un seul endroit du fichier et pas a chaque fois que je me sert de cette bibliotheque ?

  6. #6
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Citation Envoyé par sambia39 Voir le message
    Pour remédier à cela, il vous faut lier vos fichiers objet avec la bibliothèque fournie.
    FYP


    Pour obtenir un programme exécutable autonome, il ne suffit pas de fournir au compilateur les prototypes des fonctions que tu emploies, déclarées dans le fichier .h . Il faut ensuite fournir à l'éditeur de liens leurs « définition compilée » soit dans des fichiers objets, soit dans des fichiers de bibliothèques statiques ou dynamiques.

    Un prototype annonce seulement « la fonction foobar attend ceci et retourne cela », il ne dit pas ce que la fonction réalise précisément. C'est une « boîte noire ».

    Le modèle de compilation C est expliqué plus en détail par picodev dans la première moitié de ce message (clic !).

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 171
    Par défaut
    j'ai vraiment du mal a faire le lien entre tous les fichiers.. je vais voir ton lien

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 502
    Billets dans le blog
    1

  9. #9
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 171
    Par défaut
    Je vois bien que le probleme c'est l'editeur de liens mais pour moi ma biblotheque est au bon endroit.

    Ici j'ai ma bibliotheque:
    Nom : workspace_h.jpg
Affichages : 656
Taille : 27,2 Ko

    Ici elle est appelee dans une autre bibliotheque:
    Nom : workspace_uart.jpg
Affichages : 650
Taille : 18,9 Ko

    Et finalement j'appelle uart.h dans mon main:
    Nom : workspace_main.jpg
Affichages : 668
Taille : 19,0 Ko

    Apres le logiciel s'occupe de la compilation je vois pas ce que je peux y changer

    EDIT:
    J'ai essaye de voir des tutos pour ajouter proprement des librairies sous eclipse mais pourtant il semble bien que ces dernieres soient deja correctement importees je seche completement la:
    Nom : workspace_properties.jpg
Affichages : 723
Taille : 527,1 Ko

  10. #10
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 502
    Billets dans le blog
    1
    Par défaut
    L'include path, ce n'est que l'endroit où trouver les *.h. Si cette liste est incomplète, ton erreur sera plutot "could find xxxx.h" sur la ligne qui fait "xxxx.h".

    Quand je vois ce que tu fais, je pense qu'il n'y a pas vraiment de bibliothèque au sens *.a / *.lib / *.dll. Tu as juste plein de *.c qui correspondent à la bibliothèque LL. Relis la FAQ et assures toi que les deux premiers points sont OK :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    1. qu'un autre fichier source contient bien la définition du symbole ;
    2. que tous les fichiers source sont correctement ajoutés au projet et seront bien utilisés lors de l'édition des liens ;
    Mets toi sur la fonction qui pose problème et appui sur F3, normalement ça t'ouvre sa définition (et non pas juste sa déclaration).

  11. #11
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 171
    Par défaut
    Salut, encore merci pour vos reponses.

    Alors du coup j'ai repris mon projet a partir du moment ou ca a commence a deconne et effectivement certaines librairies ne sont pas correctement appellees:
    Nom : buglibrairies.jpg
Affichages : 711
Taille : 417,6 Ko

    Je possede toutes ces librairies dans un dossier:
    Nom : libraires.jpg
Affichages : 714
Taille : 274,3 Ko

    Comment est ce que je peux les ajouter de maniere propre sur mon projet?

  12. #12
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 502
    Billets dans le blog
    1
    Par défaut
    Le projet a été généré avec STM32CubeMX en choisissant bien SW4STM32 dans Project Settings - Toolchain/IDE ?

    C'est bien de nous montrer les *.h, mais ce qui pose problème ici, ce sont les *c !

  13. #13
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 171
    Par défaut
    Oui en fait mon projet c'est gondola_project_v1 genere sous STM32CubeMX avec les bons parametres pour SW4STM32 mais maintenant j'essaye d'y ajouter des choses par moi meme et j'ai donc besoin d'ajouter les librairies provenant d'un autre projet "d'exemples" fourni par ST qui sont dans le dossier suivant (la du coup j'ai mis les .c):

    Nom : fichiersc.jpg
Affichages : 672
Taille : 331,5 Ko

    Est ce que en copiant simplement les .c et .h au bon endroit cela va fonctionner ou est ce qu'il y a une maniere plus propre de les ajouter a mon projet ?

  14. #14
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 502
    Billets dans le blog
    1
    Par défaut
    Ne t'amuse pas à aller chercher des fichiers en dehors de ton projet Eclipse. Copie-colle les dans un dossier à l'intérieur de ton projet.

  15. #15
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 171
    Par défaut
    Ok bon alors j'ai copie les .c et les .h dans leur dossiers respectifs, j'ai eu quelques erreurs dues a des fichiers en trop que j'ai donc supprime et desormais tout fonctionne correctement.

    J'ai pas tout compris mais tant que ca marche je prends ahah

    Merci

  16. #16
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 502
    Billets dans le blog
    1
    Par défaut
    Eclipse doit savoir quoi compiler. Quand tu vas chercher des *.h ailleurs, tu ajoutes des dossiers à l'include path pour qu'il les trouve.

    Pour les *.c, il y de la configuration similaire à faire, mais c'est pas forcément évident. Dans ton cas, tu ne l'avais pas fait donc il ne compilait pas *.c que tu aurais aimé qu'il compile et ne s'en servait pas ensuite pour l'édition des liens.

    En rapatriant tout, tu as tout mis dans des dossiers qu'il connait et donc il prend bien tes fichiers.

  17. #17
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 171
    Par défaut
    Ok super, merci beaucoup pour les explications c'est deja plus clair

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

Discussions similaires

  1. [MySQL] réponse vide alors que le champs existe dans la table, sans retour d'erreur
    Par ben_skywalker dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 15/02/2007, 14h20
  2. [9i]erreur de type alors que le type est le meme...
    Par hoaxpunk dans le forum Oracle
    Réponses: 12
    Dernier message: 01/02/2006, 17h45
  3. [MySQL] Supprimer les erreurs de syntaxe dues aux quotes
    Par gotenks dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/01/2006, 16h10
  4. Réponses: 12
    Dernier message: 21/01/2006, 19h27

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