C создайте файл «неопределенная ссылка на «

#c #makefile #g #fltk

#c #сделать файл #g #fltk

Вопрос:

Я новичок в программировании ООП на C и makefile. Для проекта я пытаюсь переделать CandyCrush с помощью FLTK.

Моя структура проекта такова :

  • графический интерфейс/:
    • MainWindow.cpp /.h
    • Basicshape.cpp /.h
    • Functionable.cpp /.h
  • логика/:
    • Matrix.cpp /.h
    • Cell.cpp /.h
    • Item.cpp /.h
    • Position.cpp /.h
  • main.cpp
  • сделать файл

Вот содержимое моего файла makefile :

 FLAGS=--std='c  20' -Wall -Wextra -Wpedantic -lfltk  all:CandyCrush  CandyCrush: main.o Matrice.o Cell.o Item.o Position.o Mainwindow.o BasicShape.o Functionable.o  g   -o CandyCrush main.o Matrice.o Cell.o Item.o Position.o Mainwindow.o BasicShape.o Functionable.o -lfltk  Cell.o: logic/Cell.h logic/Cell.cpp  g   $(FLAGS) -c logic/Cell.cpp -o Cell.o Item.o: logic/Item.h logic/Item.cpp  g   $(FLAGS) -c logic/Item.cpp -o Item.o Position.o: logic/Position.h logic/Position.cpp  g   $(FLAGS) -c logic/Position.cpp -o Position.o Matrice.o: logic/Matrice.h logic/Matrice.cpp  g   $(FLAGS) -c logic/Matrice.cpp -o Matrice.o  BasicShape.o: gui/BasicShapes.h gui/BasicShapes.cpp  g   $(FLAGS) -c gui/BasicShapes.cpp -o BasicShape.o Functionable.o: gui/Functionable.h gui/Functionable.cpp  g   $(FLAGS) -c gui/Functionable.cpp -o Functionable.o Mainwindow.o: gui/Mainwindow.h gui/Mainwindow.cpp  g   $(FLAGS) -c gui/Mainwindow.cpp -o Mainwindow.o  main.o: main.cpp  g   $(FLAGS) -c main.cpp -o main.o  

Я знаю, что могу имитировать это с помощью %.o %.cpp ect. Но для целей списания я предпочитаю устанавливать свой файл make таким образом.

Вот мое сообщение об ошибке после использования make (оно компилирует main.o -gt; функционально.o):

 g   -o CandyCrush main.o Matrice.o Cell.o Item.o Position.o Mainwindow.o BasicShape.o Functionable.o -lfltk /usr/bin/ld: main.o: in function `MainWindow::MainWindow()': main.cpp:(.text._ZN10MainWindowC2Ev[_ZN10MainWindowC5Ev] 0xdc): undefined reference to `Rectangle::~Rectangle()' /usr/bin/ld: main.o: in function `MainWindow::~MainWindow()': main.cpp:(.text._ZN10MainWindowD2Ev[_ZN10MainWindowD5Ev] 0x28): undefined reference to `Rectangle::~Rectangle()' collect2: error: ld returned 1 exit status make: *** [makefile:6: CandyCrush] Error 1 rm *.o  

У меня эта ошибка после попытки наследовать метод draw() в прямоугольнике и круге из Sketchable:

 class Sketchable { public:  virtual void draw()const=0; };  struct Point{  int x,y; };  class BasicShape{ protected:  Point center;  Fl_Color frameColor=FL_BLACK, fillColor=FL_WHITE; public:  ~BasicShape(); };  class Rectangle: public virtual BasicShape, public virtual Sketchable{  int w,h; public:  Rectangle(Point center, int width, int height, Fl_Color frameColor=FL_BLACK, Fl_Color fillColor=FL_WHITE);  void draw() const override  ~Rectangle(); };  class Circle:public virtual BasicShape, public virtual Sketchable{  int r,w,h; public:  Circle(Point center, int rayon, Fl_Color frameColor=FL_BLACK, Fl_Color=FL_WHITE);  void draw() const override;  ~Circle(); };  

Заранее спасибо за вашу помощь.

Комментарии:

1. Вы объявляете Rectangle деструктор ~Rectangle , но где вы его определяете (реализуете)? Если вы нигде его не реализуете, то, возможно, он не нужен, и вам следует удалить объявление?

2. Ни один из этих классов, похоже, вообще не нуждается в деструкторе.

3. Деструктор прямоугольника может быть виртуальным или чисто виртуальным.