Undefined reference to for a class

When I compile my main code, it gives me an error and I read up about it but couldn't find anything.

/*
 * The Effect abstract class for the GauntletII project.
 */

#ifndef Effect_h
#define Effect_h

#import <FastLED.h>

class Effect {

    protected:
        CRGB *leds;
        int width, height;
    
        struct CRGB& pixel(int x, int y);
        bool inXRange(int x);
        bool inYRange(int y);
    
        void clearLeds();

    public:
        Effect(CRGB *leds, int width, int height);

        virtual void start() {};

};

#endif
Arduino: 1.8.8 (Mac OS X), Board: "Arduino/Genuino Uno"

In file included from sketch/Effect.h:8:0,
                 from sketch/twinkle.cpp:5:
/Users/jonathanfelix/Documents/Arduino/libraries/FastLED/FastLED.h:17:21: note: #pragma message: FastLED version 3.002.000
 #    pragma message "FastLED version 3.002.000"
                     ^
In file included from sketch/Effect.h:8:0,
                 from sketch/twinkle.cpp:5,
                 from /Users/jonathanfelix/Documents/Arduino/sd_card_lights/sd_card_lights.ino:4:
/Users/jonathanfelix/Documents/Arduino/libraries/FastLED/FastLED.h:17:21: note: #pragma message: FastLED version 3.002.000
 #    pragma message "FastLED version 3.002.000"
                     ^
/var/folders/sn/s5gtxzh907q8mmf73yr8fjs40000gn/T//ccEmA6Db.ltrans1.ltrans.o: In function `Twinkle::Twinkle(CRGB*, int, int, bool, bool)':
sketch/twinkle.cpp:27: undefined reference to `Effect::Effect(CRGB*, int, int)'
collect2: error: ld returned 1 exit status
exit status 1
Error compiling for board Arduino/Genuino Uno.

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

You posted incomplete code. Please supply enough so that we can reproduce the same compiler error.

the rest is really messy I need to organize it and get rid of some variables I'm not using.

#include "twinkle.cpp"
int crn = 1;
#define HEIGHT 14
#define WIDTH 14
#include <FastLED.h>

#define NUM_LEDS WIDTH * HEIGHT





#include <SPI.h>
#include <SD.h>

#define DATA_PIN 3    // your data arduino pin
#define CHIPSET WS2812B  // your LED chip type
#define CMD_NEW_DATA 1
//#define BAUD_RATE 500000  //if using Glediator via serial
const byte interruptPin = 2;
unsigned char x = 14; // matrix x size
unsigned char y = 14; // matrix y size
volatile int buttoncount = 0;
static unsigned long last_interrupt_time = 0;


#define MAX_TWINKS 25
#define OFFSET 0xB000







File fxdata;
CRGB leds[NUM_LEDS];

void irpt(){
 
  unsigned long interrupt_time = millis();

  // debounce  
  if ((interrupt_time - last_interrupt_time) > 100) 
  {  
  if(buttoncount==8){
    buttoncount=0;
  } else {
  buttoncount++;}
  
  Serial.println(buttoncount);
  
  }
  
  last_interrupt_time = interrupt_time;
  
}


void setup()
{
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), irpt, LOW);
  FastLED.addLeds<CHIPSET, DATA_PIN, GRB>(leds, NUM_LEDS); //see doc for different LED strips
//  Serial.begin(BAUD_RATE); // when using Glediator via usb
  Serial.begin(115200);

  for(int y = 0 ; y < NUM_LEDS ; y++)
  {
    leds[y] = CRGB::Black; // set all leds to black during setup
  }
  FastLED.show();

  pinMode(10, OUTPUT); // CS/SS pin as output for SD library to work.
  

  if (!SD.begin(4))
  {
    Serial.println("sdcard initialization failed!");
    return;
  }
  Serial.println("sdcard initialization done.");

  


}
int serialGlediator ()
{while (!Serial.available()) {}
 return Serial.read(); }

void loop(){
//first
  while(buttoncount==0){
  if (buttoncount!=0){fxdata.close(); break;}
  fxdata = SD.open("pl.dat"); 
  Serial.println("Good"); 
  if (buttoncount!=0){
    fxdata.close();
            break;
        }
  if (fxdata){
    if (buttoncount!=0){
      fxdata.close();
            break;
        }
      
    }

  while (fxdata.available()){
    if (buttoncount!=0){
      fxdata.close();
            break;
        }
    fxdata.readBytes((char*)leds, NUM_LEDS*3);
    if (buttoncount!=0){
      fxdata.close();
            break;
        }
    ledSort(crn);
    if (buttoncount!=0){
      fxdata.close();
            break;
        }//1-4 possible, set your first LED's position. Change the number: 1=TL(top left),2=TR(top right),3=BL(bottom left),4=BR(bottom right)
     FastLED.show();
     if (buttoncount!=0){
      fxdata.close();
            break;
        }
    delay(10); 
    if (buttoncount!=0){
      fxdata.close();
            break;
        }// set the speed of the animation. 20 is appx ~ 500k bauds
  }
if (buttoncount!=0){
            fxdata.close();
            break;
            
        }
  
  fxdata.close();
}



//second
while(buttoncount==1){
  if (buttoncount!=1){
    fxdata.close();
            break;}
  fxdata = SD.open("slow.dat");  
  if (buttoncount!=1){
    fxdata.close();
            break;
        }
  if (fxdata){
    if (buttoncount!=1){
      fxdata.close();
            break;
        }
      
    }

  while (fxdata.available()){
    if (buttoncount!=1){
      fxdata.close();
            break;
        }
    fxdata.readBytes((char*)leds, NUM_LEDS*3);
    if (buttoncount!=1){
      fxdata.close();
            break;
        }
    ledSort(crn);
    if (buttoncount!=1){
      fxdata.close();
            break;
        }//1-4 possible, set your first LED's position. Change the number: 1=TL(top left),2=TR(top right),3=BL(bottom left),4=BR(bottom right)
     FastLED.show();
     if (buttoncount!=1){
      fxdata.close();
            break;
        }
    delay(10); 
    if (buttoncount!=1){
      fxdata.close();
            break;
        }// set the speed of the animation. 20 is appx ~ 500k bauds
  }
if (buttoncount!=1){
            fxdata.close();
            break;
            
        }
  
  fxdata.close();
}


//third

while(buttoncount==2){
  if (buttoncount!=2){
    fxdata.close();
            break;}
  fxdata = SD.open("cplasma.dat");  
  if (buttoncount!=2){
    fxdata.close();
            break;
        }
  if (fxdata){
    if (buttoncount!=2){
      fxdata.close();
            break;
        } }

  while (fxdata.available()){
    if (buttoncount!=2){
      fxdata.close();
            break;
        }
    fxdata.readBytes((char*)leds, NUM_LEDS*3);
    if (buttoncount!=2){
      fxdata.close();
            break;
        }
    ledSort(crn);
    if (buttoncount!=2){
      fxdata.close();
            break;
        }//1-4 possible, set your first LED's position. Change the number: 1=TL(top left),2=TR(top right),3=BL(bottom left),4=BR(bottom right)
     FastLED.show();
     if (buttoncount!=2){
      fxdata.close();
            break;
        }
    delay(10); 
    if (buttoncount!=2){
      fxdata.close();
            break;
        }// set the speed of the animation. 20 is appx ~ 500k bauds
  }
if (buttoncount!=2){
            fxdata.close();
            break;
            
        }
  
  fxdata.close();
}

//fourth

while(buttoncount==3){
  if (buttoncount!=3){
    fxdata.close();
            break;}
  fxdata = SD.open("fire.dat");  
  if (buttoncount!=3){
    fxdata.close();
            break;
        }
  if (fxdata){
    if (buttoncount!=3){
      fxdata.close();
            break;
        }
      
    }

  while (fxdata.available()){
    if (buttoncount!=3){
      fxdata.close();
            break;
        }
    fxdata.readBytes((char*)leds, NUM_LEDS*3);
    if (buttoncount!=3){
      fxdata.close();
            break;
        }
    ledSort(crn);
    if (buttoncount!=3){
      fxdata.close();
            break;
        }//1-4 possible, set your first LED's position. Change the number: 1=TL(top left),2=TR(top right),3=BL(bottom left),4=BR(bottom right)
     FastLED.show();
     if (buttoncount!=3){
      fxdata.close();
            break;
        }
    delay(20); 
    if (buttoncount!=3){
      fxdata.close();
            break;
        }// set the speed of the animation. 20 is appx ~ 500k bauds
  }
if (buttoncount!=3){
            fxdata.close();
            break;
            
        }
  
  fxdata.close();
}

Heres the first part its too big to post at one time

The Effect.cpp file is not being included in your build (or it doesn't define the object constructor).

#include "twinkle.cpp"

That, in itself is an unusual thing to do.

Bugflip:
the rest is really messy I need to organize it and get rid of some variables I'm not using.

Agreed. Better to post an MCVE

and heres the second part

//fifth

while(buttoncount==4){
  if (buttoncount!=4){
    fxdata.close();
            break;}
  fxdata = SD.open("frac.dat");  
  if (buttoncount!=4){
    fxdata.close();
            break;
        }
  if (fxdata){
    if (buttoncount!=4){
      fxdata.close();
            break;
        }
      
    }

  while (fxdata.available()){
    if (buttoncount!=4){
      fxdata.close();
            break;
        }
    fxdata.readBytes((char*)leds, NUM_LEDS*3);
    if (buttoncount!=4){
      fxdata.close();
            break;
        }
    ledSort(crn);
    if (buttoncount!=4){
      fxdata.close();
            break;
        }//1-4 possible, set your first LED's position. Change the number: 1=TL(top left),2=TR(top right),3=BL(bottom left),4=BR(bottom right)
     FastLED.show();
     if (buttoncount!=4){
      fxdata.close();
            break;
        }
    delay(20); 
    if (buttoncount!=4){
      fxdata.close();
            break;
        }// set the speed of the animation. 20 is appx ~ 500k bauds
  }
if (buttoncount!=4){
            fxdata.close();
            break;
            
        }
  
  fxdata.close();
}

//sixth

while(buttoncount==5){
  if (buttoncount!=5){fxdata.close();break;} 
  fxdata = SD.open("slow.dat");  
  if (buttoncount!=5){fxdata.close();break;}if (fxdata){
  if (buttoncount!=5){fxdata.close();break;}}

  while (fxdata.available()){
    if (buttoncount!=5){
      fxdata.close();
            break;
        }
    fxdata.readBytes((char*)leds, NUM_LEDS*3);
    if (buttoncount!=5){
      fxdata.close();
            break;
        }
    ledSort(4);
    if (buttoncount!=5){
      fxdata.close();
            break;
        }//1-4 possible, set your first LED's position. Change the number: 1=TL(top left),2=TR(top right),3=BL(bottom left),4=BR(bottom right)
     FastLED.show();
     if (buttoncount!=5){
      fxdata.close();
            break;
        }
    delay(10); 
    if (buttoncount!=5){
      fxdata.close();
            break;
        }// set the speed of the animation. 20 is appx ~ 500k bauds
  }
if (buttoncount!=5){
            fxdata.close();
            break;
            
        }
  
  fxdata.close();
}

//seventh 

while(buttoncount==6){
  if (buttoncount!=6){fxdata.close();break;} 
  fxdata = SD.open("sd.dat");  
  if (buttoncount!=6){fxdata.close();break;}if (fxdata){
  if (buttoncount!=6){fxdata.close();break;}}

  while (fxdata.available()){
    if (buttoncount!=6){
      fxdata.close();
            break;
        }
    fxdata.readBytes((char*)leds, NUM_LEDS*3);
    if (buttoncount!=6){
      fxdata.close();
            break;
        }
    ledSort(4);
    if (buttoncount!=6){
      fxdata.close();
            break;
        }//1-4 possible, set your first LED's position. Change the number: 1=TL(top left),2=TR(top right),3=BL(bottom left),4=BR(bottom right)
     FastLED.show();
     if (buttoncount!=6){
      fxdata.close();
            break;
        }
    delay(10); 
    if (buttoncount!=6){
      fxdata.close();
            break;
        }// set the speed of the animation. 20 is appx ~ 500k bauds
  }
if (buttoncount!=6){
            fxdata.close();
            break;
            
        }
  
  fxdata.close();
}

//eight

while(buttoncount==7){
  if (buttoncount!=7){fxdata.close();break;} 
  fxdata = SD.open("lines.dat");  
  if (buttoncount!=7){fxdata.close();break;}if (fxdata){
  if (buttoncount!=7){fxdata.close();break;}}

  while (fxdata.available()){
    if (buttoncount!=7){
      fxdata.close();
            break;
        }
    fxdata.readBytes((char*)leds, NUM_LEDS*3);
    if (buttoncount!=7){
      fxdata.close();
            break;
        }
    ledSort(4);
    if (buttoncount!=7){
      fxdata.close();
            break;
        }//1-4 possible, set your first LED's position. Change the number: 1=TL(top left),2=TR(top right),3=BL(bottom left),4=BR(bottom right)
     FastLED.show();
     if (buttoncount!=7){
      fxdata.close();
            break;
        }
    delay(10); 
    if (buttoncount!=7){
      fxdata.close();
            break;
        }// set the speed of the animation. 20 is appx ~ 500k bauds
  }
if (buttoncount!=7){
            fxdata.close();
            break;
            
        }
  
  fxdata.close();
}

while(buttoncount==8){
  doTwinkle();
}












}


void doTwinkle() {
    Twinkle twinkle(leds, WIDTH, HEIGHT, true, true);
    twinkle.start();
}




 
int ledSort (int modus) { //1=TL,2=TR,3=BL,4=BR, this function will rearrange the led array ;-)
    
 CRGB tmp[x];
    if(modus == 3 || modus == 4) {

  for(int i = 0; i < (y / 2);i++) {
      for(int j = 0; j < x;j++) {
    tmp[j] = leds[i * x + j];
    leds[i * x] = leds[(y - i - 1) * x];
    leds[(y - i - 1) * x] = tmp[j];
       }
        }
     }

     if(modus == 1 || modus == 3) {
       for(int i = 1; i < y; i = i + 2) {
       for(int j = x; j > 0;j--) {
        tmp[(x - j)] = leds[i * x + j - 1];
          }
           for(int j = 0; j < x;j++) {
      leds[i * x + j] = tmp[j];
      }
       }

      }


     if(modus == 2 | modus == 4) {
      for(int i = 0; i < y; i = i + 2) {
       for(int j = x; j > 0;j--) {
        tmp[(x - j)] = leds[i * x + j - 1];
          }
           for(int j = 0; j < x;j++) {
      leds[i * x + j] = tmp[j];
      }
       }

      }
      return 1;
}
#import <FastLED.h>

We don't '#import' in C++.

gfvalvo:

#include "twinkle.cpp"

That, in itself is an unusual thing to do.

what should I do then?

See My Reply #3 to This Discussion Thread.