[Résolu] Compilation : problème

Bonsoir à toutes et à tous,

Je suis en train de fabriquer un mastermind à base d’arduino, de LED RGB et de TLC5940.
Pour ça je me suis dis que j’allais coder en C++.

J’ai donc procédé étape par étape, en jouant d’abord avec les LED et le TLC5940.
J’ai donc créé deux “librairies” LED et ColorLED. J’ai ainsi rédigé le “.cpp” et le “.h”, que j’ai placé dans le dossier libraries de Arduino.
Mon petit programme qui fait clignoter les LED marche au poil, il suffit d’inclure la librairie Tlc5940 dans le .h des librairies pour les LED et le tour est joué.

Je suis ensuite parti sur la rédaction de la classe Mastermind. Je me suis dis qu’elle serait aussi propre dans des classes C++ que de mettre le code directement dans le “.ino” de l’IDE arduino. Oui j’utilise la version 1.0.

Au début, mastermind n’était pas une librairie, mais juste une classe C++ que je mettais dans le dossier du projet. Mais à la compilation, le compilateur me sortais qu’il ne trouvais pas les classes. Alors je les ai basculé dans le dossier “libraries”. Mais pour ajouter mes classes LED et ColorLED, j’ai du mettre des chemins du genre :

#include <../../LED/LED.h>

Au lieu de :

#include <LED.h>

Alors que l’inclusion du Tlc5940.h marche parfaitement.

J’ai donc créé ces classes, que j’attache à ce post, mais lorsque je compile j’obtiens ceci :

mastermind_final.cpp.o: In function `Mastermind':
C:\arduino-1.0\libraries\Mastermind/Mastermind.h:22: undefined reference to `ColorLED::ColorLED()'
C:\arduino-1.0\libraries\Mastermind/Mastermind.h:22: undefined reference to `ColorLED::ColorLED()'
C:\arduino-1.0\libraries\Mastermind/Mastermind.h:22: undefined reference to `ColorLED::ColorLED()'
C:\arduino-1.0\libraries\Mastermind/Mastermind.h:22: undefined reference to `ColorLED::ColorLED()'
C:\arduino-1.0\libraries\Mastermind/Mastermind.h:22: undefined reference to `ColorLED::ColorLED()'
mastermind_final.cpp.o:C:\arduino-1.0\libraries\Mastermind/Mastermind.h:22: more undefined references to `ColorLED::ColorLED()' follow
mastermind_final.cpp.o: In function `Mastermind':
C:\arduino-1.0\libraries\Mastermind/Mastermind.h:22: undefined reference to `LED::LED()'
C:\arduino-1.0\libraries\Mastermind/Mastermind.h:22: undefined reference to `LED::LED()'
C:\arduino-1.0\libraries\Mastermind/Mastermind.h:22: undefined reference to `LED::LED()'
C:\arduino-1.0\libraries\Mastermind/Mastermind.h:22: undefined reference to `LED::LED()'
C:\arduino-1.0\libraries\Mastermind/Mastermind.h:22: undefined reference to `LED::LED()'
mastermind_final.cpp.o: In function `loop':
C:\Users\Qiou\AppData\Local\Temp\build2498907965390557632.tmp/mastermind_final.cpp:75: undefined reference to `Mastermind::winAnimation()'
Mastermind\Mastermind.cpp.o: In function `Mastermind::checkGuess()':
C:\arduino-1.0\libraries\Mastermind/Mastermind.cpp:133: undefined reference to `ColorLED::getColor()'
C:\arduino-1.0\libraries\Mastermind/Mastermind.cpp:133: undefined reference to `ColorLED::getColor()'
C:\arduino-1.0\libraries\Mastermind/Mastermind.cpp:133: undefined reference to `ColorLED::getColor()'
C:\arduino-1.0\libraries\Mastermind/Mastermind.cpp:133: undefined reference to `ColorLED::getColor()'
Mastermind\Mastermind.cpp.o: In function `Mastermind::setStatus(int)':
C:\arduino-1.0\libraries\Mastermind/Mastermind.cpp:147: undefined reference to `ColorLED::get
Color()'
C:\arduino-1.0\libraries\Mastermind/Mastermind.cpp:148: undefined reference to `LED::on()'
C:\arduino-1.0\libraries\Mastermind/Mastermind.cpp:153: undefined reference to `ColorLED::getColor()'
C:\arduino-1.0\libraries\Mastermind/Mastermind.cpp:154: undefined reference to `LED::blinkOn(int)'
Mastermind\Mastermind.cpp.o: In function `Mastermind::nextLedColor(int)':
C:\arduino-1.0\libraries\Mastermind/Mastermind.cpp:125: undefined reference to `ColorLED::nextColor()'
Mastermind\Mastermind.cpp.o: In function `Mastermind::scroll(int)':
C:\arduino-1.0\libraries\Mastermind/Mastermind.cpp:103: undefined reference to `ColorLED::setLedNbr(int)'
C:\arduino-1.0\libraries\Mastermind/Mastermind.cpp:105: undefined reference to `ColorLED::on()'
C:\arduino-1.0\libraries\Mastermind/Mastermind.cpp:107: undefined reference to `LED::setLedNbr(int)'
Mastermind\Mastermind.cpp.o: In function `Mastermind::selectionRowOff()':
C:\arduino-1.0\libraries\Mastermind/Mastermind.cpp:52: undefined reference to `ColorLED::setColor(int)'
C:\arduino-1.0\libraries\Mastermind/Mastermind.cpp:53: undefined reference to `ColorLED::off()'
Mastermind\Mastermind.cpp.o: In function `Mastermind::saveLine()':
C:\arduino-1.0\libraries\Mastermind/Mastermind.cpp:69: undefined reference to `ColorLED::setLedNbr(int)'
C:\arduino-1.0\libraries\Mastermind/Mastermind.cpp:70: undefined reference to `ColorLED::getColor()'
C:\arduino-1.0\libraries\Mastermind/Mastermind.cpp:70: undefined reference to `ColorLED::setColor(int)'
C:\arduino-1.0\libraries\Mastermind/Mastermind.cpp:78: undefined reference to `ColorLED::getColor()'
C:\arduino-1.0\libraries\Mastermind/Mastermind.cpp:78: undefined reference to `ColorLED::setColor(int)'
C:\arduino-1.0\libraries\Mastermind/Mastermind.cpp:86: undefined reference to `LED::on()'
Mastermind\Mastermind.cpp.o: In function `Mastermind::initLEDS()':
C:\arduino-1.0\libraries\Mastermind/Mastermind.cpp:23: undefined reference to `ColorLED::init(int)'
C:\arduino-1.0\libraries\Mastermind/Mastermind.cpp:29: undefined reference to `ColorLED::init(int)'
C:\arduino-1.0\libraries\Mastermind/Mastermind.cpp:38: undefined reference to `LED::init(int)'
C:\arduino-1.0\libraries\Mastermind/Mastermind.cpp:45: undefined reference to `LED::init(int)'

Voici le code du mastermind, abrégé, mais le début est le principal.
mastermind_final.ino :

#include <Mastermind.h>
#include <Tlc5940.h>
#include <Bounce.h>
#include <BounceFSR.h>


//TODELETE
//int initialized = 0;

//FSR Reading
BounceFSR fsr[4];

//BUTTONs PART
#define SENDBUTTON 2
#define PREVIOUSBUTTON 3
#define NEXTBUTTON 4
#define SUP -1
#define SDOWN 1
Bounce sendBut = Bounce(SENDBUTTON,5 ); 
Bounce previousBut = Bounce(PREVIOUSBUTTON,5 ); 
Bounce nextBut = Bounce(NEXTBUTTON,5 );

Mastermind m;

void setup(){
  Tlc.init(); 
  //Serial.begin(9600);
  delay(100);
  m.init();
}


void loop(){
        if(!m.wonGame()){
    	  if(sendBut.update()){
    		if(sendBut.risingEdge()){
    		  //Serial.println("send");
    		  m.saveLine();
    		}
    	  } else if(previousBut.update()){
    		if(previousBut.risingEdge()){
    		  //Serial.println("previous");
    		  m.scroll(SUP);
    		}
    	  } else if(nextBut.update()){
    		if(nextBut.risingEdge()){
    		  //Serial.println("next");
    		  m.scroll(SDOWN);
    		}
    	  } else if(fsr[0].update()){
    		if(fsr[0].risingEdge()){
    		  //Serial.println("FSR0");
    		  m.nextLedColor(0);
    		}
    	  } else if(fsr[1].update()){
    		if(fsr[1].risingEdge()){
    		  //Serial.println("FSR1");
    		  m.nextLedColor(1);
    		}
    	  } else if(fsr[2].update()){
    		if(fsr[2].risingEdge()){
    		  //Serial.println("FSR2");
    		  m.nextLedColor(2);
    		}
    	  } else if(fsr[3].update()){
    		if(fsr[3].risingEdge()){
    		  //Serial.println("FSR3");
    		  m.nextLedColor(3);
    		}
    	  }
	} else {
		m.winAnimation();
		delay(1000);
		m.reset();
	}

}

Mastermind.h :

#ifndef MASTERMIND_H
#define MASTERMIND_H


#include "../LED/LED.h"
#include "../ColorLED/ColorLED.h"

#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif

#define DISPLAYEDROWS 5
//for each row, there's 4 colorLED and 4 LED
#define MAXLEDINROW 4
#define MAXSTATUSLED 4
#define MAXLEVELLED 8
#define MAXROWS 8
#define MAXLEVELS 8

class Mastermind{
private:

Mastermind.cpp :

#include "Mastermind.h"

void Mastermind::init(){
	initLEDS();
	generateCode();
	guess = 0;
	scrollIndex = 4;
	won=false;
}

PS : pas de constructeur, c’est normal, car doit être initialisé après l’initialisation du Tlc.

LED.h :

#ifndef LED_H
#define LED_H
//to be able to compile with older arduino
//IDE version lower than 1.0
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif

class LED{
...
};
#endif

LED.cpp :

#include "LED.h"

LED::LED(){
	ledState=LOW;
	previousMillis=0;
	blink = false;
}
...

ColorLED.h :

#ifndef COLORLED_H
#define COLORLED_H

#include <Tlc5940.h>
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif

#define COFF 0
#define CRED 1
#define CGREEN 2
#define CBLUE 3
#define CYELLOW 4
#define CWHITE 5
#define CVIOLET 6
#define MAXCOLORS 6
//OLD COLORS
//#define CCYAN 4
//#define CMAGENTA 5
//#define CORANGE 8
//#define CSPRINGREEN 10

class ColorLED{
...
};
#endif

ColorLED.cpp :

#include "ColorLED.h"

ColorLED::ColorLED(){
	color = COFF;
	ledState=LOW;
	previousMillis=0;
}
...

Bien j’ai fini par trouver la solution :

J’ai inclus tous les .h dans le projet .ino de l’IDE arduino.

en gros :

#include <Mastermind.h>
#include <Tlc5940.h>
#include <Bounce.h>
#include <BounceFSR.h>
#include <LED.h>
#include <ColorLED.h>

Et maintenant ça compile.

J’espère que ce n’est pas un problème, peut être est ce obligatoire, mais ça me parait bizarre.
Bref si ça peut aider d’autres personnes !

Peut-être une piste à documenter. Poster sur vos blogs (je n’en ai pas).

Tu parles de .ino, est ce que tu utilises Arduino 1.0 ?

Bonjour,

qiou:
J’espère que ce n’est pas un problème, peut être est ce obligatoire, mais ça me parait bizarre.
Bref si ça peut aider d’autres personnes !

Peut-être une piste à documenter. Poster sur vos blogs (je n’en ai pas).

C’est une question de chemin relatif/absolu et de “liens” après compilation, c’est comme pour la librairie Ethernet, pour inclure <Ethernet.h> il faut inclure <SPI.h> dans le skecth.
Si ta lib requiére l’inclusion d’une autre lib rajoute un :

#if !defined(_LIB_TRUC_)
#error "La lib machin requiére la lib truc pour fonctionner, merci d'ajouter #include <truc.h> dans votre sketch !"
#endif