Incompréhension de compilation
salut,
donc je crée un nouveau post pour ce problème de compilation sur mega 2560,dés que je crée un fichier annexe...
voici un exemple
mon progprinc.ino
je vous épargne les 1600 lignes......
ensuite mon cryptdecrypr.h
et voici l'erreur que j'obtiens
sans oublié de dire que les variables vecteur et key ne sont utilisée que ici et que je n'utilise pas ces fonctions (pour le moment), donc si j'enlève le #include "cryptdecrypt.h", ça compile parfaitement....
merci pour vos lumières...
donc je crée un nouveau post pour ce problème de compilation sur mega 2560,dés que je crée un fichier annexe...
voici un exemple
mon progprinc.ino
code: [select]
#include <spi.h>
#include <sd.h>
#include <mstimer2.h>
#include <rtclib.h>
#include <wire.h>
#include "cryptdecrypt.h"
// port série
//serial3 rs485 sur pin(15-rx, 14-tx)
//serial2 rs232 sur pin(17-rx, 16-tx)
// constante enregistrement des fichiers
#define max_dirname_len 9
#define max_filename_len 14
// variables globales
bool initok = true;
volatile bool recordrunning = false;
volatile bool resetrunning = false;
volatile bool supportpres = true;
// enregistrement des fichiers
char dirname[max_dirname_len];
char filename[max_filename_len];
// variables dm
unsigned int nbreceivedbyte;
int nbbytetoread;
unsigned int zonetoread;
bool s33;
bool timeout;
// pour afficher un date time
unsigned char timestamp[30];
// rtc
rtc_ds1307 rtc;
//rtc_pcf8523 rtc;
// réccupération de la date actuelle
datetime now;
//==============================================================================
// fonctions d'interruption
void intrecord(void);
void intreset(void);
void intsupportlost(void);
void intgetsupport(void);
//==============================================================================
// fonctions gestion ihm
void clignoencours();
void clignoledverte(void);
void clignoledrouge(void);
void recordstate(const bool pledrecordko, const bool pledrecordok);
void resetstate(const bool pledresetko, const bool pledresetok);
void testihm(void);
//==============================================================================
// fonctions gestion relais
void pilotermode(const int pmode0, const int pmode1, const int pdetect, const int pvaux, const int prreset);
void piloterdiscret(const int paicfli_1, const int paicfli_2, const int ppinprog_2, const int pbatwup_1, const int pbatwup_2, const int pemedis, const int pj2start);
void switchoffbat(void);
//==============================================================================
// fonctions reset
bool miseenroute(const unsigned int pbatflt1);
extern bool resetbat(const unsigned int pputrdy, const unsigned int psocrdy);
//==============================================================================
// fonctions lecture dm
bool lecturedmdata(char *pdirname);
bool lecturezone(unsigned char pfirstpagetoread, unsigned char pnbpagetoread, char *pdirname, char *pfilename);
bool getrs485data(char *pdirname, char *pfilename);
bool getdata(char *pdirname, char *pfilename);
char *str_sub (const char *, unsigned int, unsigned int);
bool getbatfault1(const unsigned int pbatflt1);
bool switchoffbatfault1(const unsigned int pbatflt1);
void rdytoreaddm(void);
//==============================================================================
// fonctions pld_ufd
bool rdytoreadpldufd(const unsigned int pbatflt1);
bool lecturepldufd (char *pdirname, const datetime pnow);
unsigned char miseenforme(unsigned char buffer_rs232_127_bytes[128], unsigned char *pdatatowrite, const datetime pnow);
unsigned char ascciitohex(unsigned char pval);
//==============================================================================
// gestion du temps
void datetime(uint16_t* date, uint16_t* time);
// displaytime: affiche la date et l'heure
void displaytime(datetime dt);
// secondes du rtc lors du dernier affichage
int lastdisplaysec = -1;
/*******************************************************************
* setup *
*******************************************************************/
void setup() {
// code de mise en route
}
/*******************************************************************
* loop *
*******************************************************************/
void loop() {
// si le setup() est ko, on empeche toute action --> obligé de faire un reset alimentation
if(!initok){
clignoledrouge();
delay(250);
}else{
// réccupération de la date actuelle
now = rtc.now();
// si les secondes ont changées, on raffraichie l'affichage
if ( now.second() != lastdisplaysec ) {
serial.println("display time");
displaytime(now);
lastdisplaysec = now.second();
}
// présence support
if(!supportpres)
recordstate(led_on, led_off);
/********************************************************************************************************************
* record *
********************************************************************************************************************/
if(supportpres && recordrunning){
// affichage de l'opération en cours
mstimer2::start();
// extinction des leds
resetstate(led_off, led_off);
recordstate(led_off, led_off);
// reset des relais
switchoffbat();
/==============================================================================
// lecture dm
//==============================================================================
if(!supportpres || !(recordrunning = getbatfault1(bat_flt_1)))// mise en route avec bat_fault_1
recordstate(led_on, led_off);
else if(!supportpres || !(recordrunning = switchoffbatfault1(bat_flt_1))) // extinction bat_fault_1
recordstate(led_on, led_off);
else if(supportpres){
// prêt à lire la dm
rdytoreaddm();
// voir req-sld-0120??
// lecture données dm
if(!supportpres || !(recordrunning = lecturedmdata (dirname)))
recordstate(led_on, led_off);
}
//============================================================
// fin lecture dm
//============================================================
//// et mon code continue comme ça.....
}
/*******************************************************************
* fin loop *
*******************************************************************/
je vous épargne les 1600 lignes......
ensuite mon cryptdecrypr.h
code: [select]
//==============================================================================
//
// title: cryptdecrypt.h
// purpose: fonction de gestion cryptage décryptage.
//
// created on: 27/06/2017 @ 09:51:50 pascal.
// copyright: saft. rights reserved.
//
//==============================================================================
#ifndef cryptdecrypt_h
#define cryptdecrypt_h
//==============================================================================
// include files
#include <arduino.h>
#include <aeslib.h>
#ifdef __cplusplus
extern "c" {
#endif
// définition des clé de cryptage
uint8_t key[16] = {'m', 'a', 'c', 'l', 'e'}; // 16 caractères
uint8_t vecteur[16] = {'m', 'o', 'n', 'v', 'e', 'c', 't', 'e', 'u', 'r'}; // 1- caractères
//==============================================================================
// global functions
extern void cryptaes128cbcdata(unsigned char *data);
extern void decryptaes128cbcdata(unsigned char *data);
#ifdef __cplusplus
}
#endif
#endif // cryptdecrypt_h
et voici l'erreur que j'obtiens
code: [select]
sketch\progprinc.ino.cpp.o (symbol plugin): in function `intrecord()':
(.text+0x0): multiple definition of `vecteur'
sketch\cryptdecrypt.cpp.o (symbol plugin):(.text+0x0): first defined here
c:/users/burelp/appdata/local/arduino15/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.4-arduino2/bin/../lib/gcc/avr/4.9.2/../../../../avr/bin/ld.exe: disabling relaxation: not work multiple definitions
sketch\progprinc.ino.cpp.o (symbol plugin): in function `intrecord()':
(.text+0x0): multiple definition of `key'
sketch\cryptdecrypt.cpp.o (symbol plugin):(.text+0x0): first defined here
collect2.exe: error: ld returned 1 exit status
exit status 1
erreur de compilation pour la carte arduino/genuino mega or mega 2560
sans oublié de dire que les variables vecteur et key ne sont utilisée que ici et que je n'utilise pas ces fonctions (pour le moment), donc si j'enlève le #include "cryptdecrypt.h", ça compile parfaitement....
merci pour vos lumières...
bonsoir
le problème vient du fait que les tableaux key et vecteur sont définis (et initialisés) dans le fichier d'en-tête cryptdecrypr.h. en incluant ce fichier dans le fichier .ino alors qu'il l'est déjà dans cryptdecrypt.cpp, ces définitions apparaissent deux fois durant la compilation.
les tableaux devraient être seulement déclarés dans cryptdecrypr.h afin de servir d'interface, et définis dans cryptdecrypt.cpp.
le problème vient du fait que les tableaux key et vecteur sont définis (et initialisés) dans le fichier d'en-tête cryptdecrypr.h. en incluant ce fichier dans le fichier .ino alors qu'il l'est déjà dans cryptdecrypt.cpp, ces définitions apparaissent deux fois durant la compilation.
les tableaux devraient être seulement déclarés dans cryptdecrypr.h afin de servir d'interface, et définis dans cryptdecrypt.cpp.
Arduino Forum > International > Français (Moderators: jfs, Snootlab) > Incompréhension de compilation
arduino
Comments
Post a Comment