Compilation C en vue de passer à Arduino

Bonjour à tous,

oui, je sais, ici c'est arduino, mais c'est bien là mon but.
Avant d'arriver à arduino et faire fonctionner mon LD8001B de façon appropriée, je veux compiler un programme apparament tout simple en C. Ensuite, je reprendai le tout en arduino.

Voici les erreurs de compilations obtenues:

/usr/bin/ld : /tmp/ccY3DquQ.o : dans la fonction « main » :
main.c:48 : référence indéfinie vers « MY_NVIC_SetVectorTable »
/usr/bin/ld : main.c:56 : référence indéfinie vers « adt3102SystemInit »
/usr/bin/ld : main.c:57 : référence indéfinie vers « adt3102ModuleInit »
/usr/bin/ld : /tmp/ccY3DquQ.o : dans la fonction « rxAndParseData » :
main.c:77 : référence indéfinie vers « tinyFramefRx »
/usr/bin/ld : main.c:86 : référence indéfinie vers « tinyFramefTx »
collect2: error: ld returned 1 exit status

Je prétends être en mesure de répéter la solution si nous arrivons à corriger la première erreur qui est:
référence non-définie vers MY_NVIC_SetVectorTable dans main.c à la ligne 56
Voici les premières lignes de main.c

#include "CM3DS_MPS2.h"
#include "adt3102.h"
#include "adt3102_type_define.h"
#include "adt3102_system.h"
#include "TinyFrame.h"
#include "common.h"
#include <stdio.h>
#include <math.h>

volatile uint8  g_powerThdFlag      = 0;
volatile uint32 g_frameStart        = 0;
static uint8                        s_version_major;
static uint8                        s_version_minor;
static uint8                        s_version_patch;
static verStatusTypedef             s_verStatus;
static TinyFrameRx                  s_revTestStr;

static void rxAndParseData(void);
int main(void)
{
    MY_NVIC_SetVectorTable(0x00000000, 0x8000);

    /*------------ Local variable declaration ------------*/
    s_version_major = 1;
    s_version_minor = 5;
    s_version_patch = 10;

    /*----- Initialize some basic functions --------------*/
    adt3102SystemInit();
    adt3102ModuleInit();

    /*------------- Function realization -----------------*/
    while(1)
    {
        rxAndParseData();
    }
}

or la fonction MY_NVIC_SetVectorTable est définie dans adt3102_system.h
comme suit:

void MY_NVIC_SetVectorTable(uint32 NVIC_VectTab, uint32 Offset);

et adt3102_system.h est bien appelé par main.h dès la ligne 4

Tous les fichiers .h sont réunis dans un seul et même répertoire, le compilateur n'a donc pas à chercher sur mon disque.
Le fichier .c correspondant (adt3102_system.c) est lui aussi présent dans ce même répertoire.

Que cherche donc le compilateur, alors ?

Merci de votre aide.

comment compilez vous ?

le .h va donner des infos sur ce qui existe, mais à l'édition de lien il faudra fournir tous les codes compilés.

Wow quelle réactivité !

Tous les fichiers sont dans github

Pour compiler - sous Linux - j'utilise la commande suivante:

gcc -Wall -g -o LD80001B main.c -lm

tandis que je me trouve dans le répertoire « tout » où se trouvent tous les fichiers.
La commande vient de chapitre 12 Debian

Peut-être un piste:
si j'ajoute l'option -v à ma commande de compilation, j'obtiens l'information suivante:

#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc/x86_64-linux-gnu/12/include
/usr/local/include
/usr/include/x86_64-linux-gnu
/usr/include
End of search list.

en réponse à la ligne #include "...",
ne devrais-je pas obtenir le chemin du répertoire où je me trouve ?
ex. ~/sources/app/c_demo/tout
?

Votre commande ne compile que main.c et inclut uniquement la bibliothèque mathématique via l’option -lm, qui lie la bibliothèque partagée /usr/lib/libm.so (précompilée).

➜ avec cette commande le compilateur ne sait pas qu’il y a d’autres fichiers de code et n’inclut pas automatiquement les autres fichiers .c du répertoire dans sa compilation et édition de liens.

Pour inclure tous vos fichiers .c, essayez de remplacer main.c par *.c dans votre ligne de commande comme ceci :

gcc -Wall -g -o LD80001B *.c -lm

« L’étoile point c » veut dire « tous les noms de fichiers qui se terminent par .c dans le répertoire courant ».

Cela permet de compiler individuellement chaque fichier .c en un objet intermédiaire, puis de lier tous ces objets pour former l’exécutable.

Enfin, si votre projet dépend aussi d’autres bibliothèques systèmes ou externes, vous devez les ajouter explicitement dans la phase d’édition de liens avec l’option -l<nom_de_la_bibliothèque>.

Par exemple, pour lier une bibliothèque nommée libxyz.so, ajoutez -lxyz à votre commande comme c’est fait pour le bibliothèque mathématique pour le moment.

(Peut être vous devriez lire un tuto sur la compilation séparée et l’édition de liens)

Merci beaucoup J-M-L encore une fois

Oui, bien sûr.

Je pensais me lancer dans quelque chose d'archi-simple parce - supposément - ça fonctionnait. Et bien, la compilation comme vous me dites de le faire m'a retourné une tonne de messages d'erreur de type « fichier manquant », puis - depuis que tous les fichiers sont là, le compilateur se plaint de liens circulaires ou de variables non-définies.

C'est du code qui - me disait-on - fonctionnait. C'est pourquoi j'osai me lancer dans cela. Mais là, ça dépasse clairement mes compétences. Je retournerai simplement le code là d'où il vient et je demanderai quelque chose de vraiment fonctionnel.

Demandez alors avec quoi le compiler

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.