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> protocol.h em> p> 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);
}
3 Réponses :
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: p>
extern flexcan_t4 flexcan; p>
#include
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.
Le problème est que Ceci est un défaut de la bibliothèque FlexCan_T4; Vous devez soumettre le problème au responsable de la bibliothèque. P> flexcan_isr_can1 code> (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 code> Mot-clé ajouté à eux. P>
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 CODE> 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 i>. Le problème ici est que flexcan_t4.h est inclus dans plusieurs unités de traduction (protocol.cpp et main.cpp).
J'ai déjà inclus les gardes, qui sont plus recommandés que #pragma une fois, et était toujours dans le fichier h: Où est le défaut que vous prétendez voir? P > p>
La langue arduino est C ++ moins certaines fonctionnalités, pas C. Le problème est que le fichier d'en-tête code> a une fonction Définition b> mais il n'a pas
#pragma une fois code>
@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).