Multiples définitions : je n'y comprends rien

Bonjour à toutes et à tous,

En transposant des méthodes et variables dans un bibliotèque, j'ai les messages suivants :

libraries\ChP_UTM-LatLon\UTM-LatLon.cpp.o:(.bss.utm_Z+0x0): multiple definition of `utm_Z'

sketch\Mon_GPS.ino.cpp.o:(.bss.utm_Z+0x0): first defined here

c:/program files/arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.8.1/../../../../avr/bin/ld.exe: Disabling relaxation: it will not work with multiple definitions

libraries\ChP_UTM-LatLon\UTM-LatLon.cpp.o:(.bss.utm_E+0x0): multiple definition of `utm_E'

sketch\Mon_GPS.ino.cpp.o:C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/HardwareSerial.h:121: first defined here

libraries\ChP_UTM-LatLon\UTM-LatLon.cpp.o:(.bss.utm_N+0x0): multiple definition of `utm_N'

sketch\Mon_GPS.ino.cpp.o:C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/HardwareSerial.h:121: first defined here

libraries\ChP_UTM-LatLon\UTM-LatLon.cpp.o:(.bss.lon+0x0): multiple definition of `lon'

sketch\Mon_GPS.ino.cpp.o:C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/HardwareSerial.h:121: first defined here

libraries\ChP_UTM-LatLon\UTM-LatLon.cpp.o:(.bss.lat+0x0): multiple definition of `lat'

sketch\Mon_GPS.ino.cpp.o:C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/HardwareSerial.h:121: first defined here

collect2.exe: error: ld returned 1 exit status

exit status 1
Erreur lors de la compilation.

Voici le sketch :

#include <UTM-LatLon.h>

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.println(utm_E);
  Serial.println(utm_N);
  Serial.println(utm_Z);
  Serial.println(lat);
  Serial.println(lon);
}

void loop() {
  // put your main code here, to run repeatedly:

}

et voici la bibliothèque :

Le fichier UTM-LatLon.h :

#ifndef UTM-LatLon_h
#define UTM-LatLon_h

#include <Arduino.h>

double lat; // latitude en degrés décimaux
double lon; // longitude en degrés décimaux
double utm_N; // Northing en mètres
double utm_E; // Easting en mètres
String utm_Z; // zone

#endif

Le fichier UTM-LatLon.cpp :

#include <Arduino.h>
#include <UTM-LatLon.h>

float k0 = 0.9996f;
float equR = 6378137; // Rayon de l'ellipsoïde valeur WGS84
float exc2 = 0.00669438; // Excentricité de l'ellipsoïde valeur WGS84

J'ai supprimé toutes les méthodes de cette librairie où des variables internes avaient le même nom que les variables incriminées, mais le problème reste le même.

Mes variables ne sont déclarées qu'une seule fois dans UTM-LatLon.h. Alors d'où vient cette erreur de multiple définitions ?

Merci de votre aide.

Pierre

Bonjour,

Tes variables sont instanciées dans le .h, donc à chaque inclusion du .h tu crées de nouvelles variables.

Il faut les déclarer extern dans le .h

#ifndef UTM-LatLon_h
#define UTM-LatLon_h

#include <Arduino.h>

extern double lat; // latitude en degrés décimaux
extern double lon; // longitude en degrés décimaux
extern double utm_N; // Northing en mètres
extern double utm_E; // Easting en mètres
extern String utm_Z; // zone

#endif

et les instancier dans le .cpp

#include <Arduino.h>
#include <UTM-LatLon.h>

double lat; // latitude en degrés décimaux
double lon; // longitude en degrés décimaux
double utm_N; // Northing en mètres
double utm_E; // Easting en mètres
String utm_Z; // zone

float k0 = 0.9996f;
float equR = 6378137; // Rayon de l'ellipsoïde valeur WGS84
float exc2 = 0.00669438; // Excentricité de l'ellipsoïde valeur WGS84

Résolu : Merci "kamill", oui, effectivement, j'avais oublié le mot clé extern.

Cordialement.

Pierre