0
votes

"Définition multiple de" quelqueigne "". Aucune idée de la réparation

J'écris une application Arduino (à l'aide de la plateforme dans VSCode) et y compris une bibliothèque de messagerie externe (FlexCAN_T4). Je veux définir tous les rappels de mon protocole / gestionnaire de messages dans un fichier séparé (protocol.cpp) et de les voir de mon fichier principal (Main.cpp). Donc, je crée un fichier d'en-tête (protocole.h) avec toutes mes signatures de fonction et inclure Protocol.h de Protocol.Cpp et Main.cpp.

mais je reçois "la définition multiple de` flexcan_isr_can1 () "" (qui est une fonction définie dans une bibliothèque référencée, flexcan_t4). Je ne peux pas comprendre comment se débarrasser de cette erreur et j'ai toujours toutes mes signatures de fonction et toutes mes constantes et que ne fonctionnent pas correctement. P>

Exemple de messages d'erreur (un pour chaque fonction non classée définie dans flexcan_t4. h): p> xxx pré>

protocol.h em> p> xxx pré>

protocole.cpp

#include "protocol.h"
#include <Arduino.h>

void setup()
{
  //some setup stuff...
}

void loop()
{
  myFunction();
}

#include "protocol.h"
FlexCAN_T4<CAN1, RX_SIZE_256, TX_SIZE_16> flexCAN;

void myFunction()
{
    //one of a hundred functions related to protocol, that should be defined outside of main.cpp.
    flexCan.doSomething(myConst);
}


2 commentaires

La langue arduino est C ++ moins certaines fonctionnalités, pas C. Le problème est que le fichier d'en-tête a une fonction Définition mais il n'a pas #pragma une fois


@Anttihaapala depuis flexcan_t4.h n'est composé de manière transitive, via Protocol.h et Protocol.h a #pragma une fois, ne devrait-il pas suffire? (Bien que j'admets, #pragma a une fois mystifié mystifiée sur plus d'une occasion, car elle ne semble jamais faire ce que je pense que ça va).


3 Réponses :


0
votes

Si les pièces associées FlexCan_T4 ne sont pas nécessaires dans Protocol.h, vous pouvez les mettre dans le fichier CPP. Comme élimination de la partie suivante et les mettre à protocole.cpp:

Inclure

extern flexcan_t4 flexcan;


2 commentaires

#include extern flexcan_t4 flexcan;


Le code que j'ai collé est simplifié pour illustrer une reproduction minimale. En réalité, il existe une tonne définition de fonction F dans Protocol.h, qui nécessite FLEXCAN_T4 pour leurs paramètres malheureusement.



0
votes

Le problème est que flexcan_isr_can1 (et d'autres fonctions) est défini dans un fichier d'en-tête qui est inclus dans plusieurs unités de traduction. Ceci est une violation de la règle d'une définition. Les définitions de fonction pertinentes doivent avoir le Inline Mot-clé ajouté à eux.


Ceci est un défaut de la bibliothèque FlexCan_T4; Vous devez soumettre le problème au responsable de la bibliothèque.


3 commentaires

Je suis l'auteur de la bibliothèque et il est toujours en développement pour la fonctionnalité du matériel. Le matériel vient de sortir récemment pour que les choses soient encore en cours .. Merci


Depuis 'flexcan_t4.h n'est composé de manière transitoire, via Protocol.h, qui est "protégée" par #pragma une fois, ne devrait-il pas arrêter une multi-incluse?


@ ROACH374 N ° #pragma Une fois ou équivalent Inclure les gardes Arrêtez une en-tête d'être incluse plus d'une fois dans la même unité de traduction . Le problème ici est que flexcan_t4.h est inclus dans plusieurs unités de traduction (protocol.cpp et main.cpp).



0
votes

J'ai déjà inclus les gardes, qui sont plus recommandés que #pragma une fois, et était toujours dans le fichier h: xxx

Où est le défaut que vous prétendez voir?


0 commentaires