Ошибка компиляции: undefined reference to

shuser
Offline
Зарегистрирован: 14.01.2016

Доброго времени суток.

Создал новый класс, но некоторые методы недоступны. Не могу понять в какую степь копать, коли одни методы вызываются нормально, другие же жалуют на undefined reference. Rus_LCD расширяет класс LCD_1602_RUS. Если же вызывать сей метод из другого класса, всё работает ок, а вот из ino файла беда...

#include <Arduino.h>
#include "RUS_LCD.h"

#pragma GCC diagnostic ignored "-Wwrite-strings"

#define STR_START L"Старт"

Rus_LCD *LCD1 = NULL;

void LCDSetup();

void setup()
{
	Serial.begin(9600);

    LCDSetup();
    LCD1->setCursor(0, 0);

    LCD1->print("Start"); // Ok
    LCD1->LastLCDRefresh = 0; //ok class member is avaliable
    LCD1->LCD_Txt(STR_START, 0, 0, true);
    /* Code::Blocks error
     *  TestLCD.ino:(.text.setup+0x56)||undefined reference to `Rus_LCD::LCD_Txt(wchar_t*, int, int, bool)'|
     *  
     *  Ardino IDE
     *  TestLCD.ino:19: undefined reference to `Rus_LCD::LCD_Txt(wchar_t const*, int, int, bool)'
     */
}

void loop()
{
    LCD1->print("Start"); // Ok
    LCD1->LastLCDRefresh = 0; //ok class member is avaliable
    //LCD1->LCD_Txt(STR_START, 0, 0, true);// TestLCD.ino:(.text.loop+0x32)||undefined reference to `Rus_LCD::LCD_Txt(wchar_t*, int, int, bool)'|
}

void LCDSetup()
{
    LCD1 = new Rus_LCD(0x3F,16,2);
    LCD1->backlight();
    LCD1->clear();
}

Код закинул на гугль-диск (https://drive.google.com/drive/folders/1oEpqenJb5j-p-G03csdoTqHxkspGyB_V...)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А класса-то почему нет? И полного сообщения об ошибке?

shuser
Offline
Зарегистрирован: 14.01.2016

Класс по ссылке в исходниках - 

#ifndef LCD_h
#define LCD_h

#ifndef Arduino_h
    #include <Arduino.h>
#endif // Arduino_h

#ifdef USE_LCD
    #include "LCD_1602_RUS.h"
#endif // USE_LCD

class Rus_LCD
{
public:
    Rus_LCD(uint8_t, uint8_t, uint8_t);
    ~Rus_LCD();

    void clear();
    void backlight();
    void setCursor(uint8_t, uint8_t);
    void print(const wchar_t[]);
    void print(const char[]);
    void print(int, int = DEC);
    void print(unsigned int, int = DEC);
    void print(long, int = DEC);
    void print(unsigned long, int = DEC);
    void print(const String &);
    void print(char, int = 0);
    void print(unsigned char, int = 0);
    void print(double, int = 2);

    unsigned long LastLCDRefresh;

    void LCD_Txt(char*, int X_Pos = 0, int Y_Pos = 0,  bool cleaning = false);
    void LCD_Txt(wchar_t*, int X_Pos = 0, int Y_Pos = 0,  bool cleaning = false);
    void LCD_Txt(String, int X_Pos = 0, int Y_Pos = 0, bool cleaning = false);
};
#endif

и второй


#include <Arduino.h>
#include "Rus_LCD.h"
#include "LCD_1602_RUS.h"

LCD_1602_RUS *pRusLCD = NULL;

Rus_LCD::Rus_LCD(uint8_t lcd_Addr, uint8_t lcd_cols, uint8_t lcd_rows)
{
    pRusLCD = new LCD_1602_RUS(lcd_Addr, lcd_cols, lcd_rows);
};

Rus_LCD::~Rus_LCD()
{
    delete pRusLCD;
};

///////////////////////////////////////////////////////////////////////////////
void Rus_LCD::clear()
{
    pRusLCD->clear();
}

void Rus_LCD::backlight()
{
    pRusLCD->backlight();
}

void Rus_LCD::setCursor(uint8_t col, uint8_t row)
{
    pRusLCD->setCursor(col, row);
}
//////////////////////
void Rus_LCD::print(const char *c_str)
{
    pRusLCD->print(*c_str);
}

void Rus_LCD::print(int val, int base)
{
    pRusLCD->print(val, base);
}

void Rus_LCD::print(long val, int base)
{
    pRusLCD->print(val, base);
}

void Rus_LCD::print(unsigned long val, int base)
{
    pRusLCD->print(val, base);
}

void Rus_LCD::print(char val, int base)
{
    pRusLCD->print(val, base);
}

void Rus_LCD::print(unsigned char val, int base)
{
    pRusLCD->print(val, base);
}

void Rus_LCD::print(double val, int base)
{
    pRusLCD->print(val, base);
}

void Rus_LCD::print(const String &str)
{
    pRusLCD->print(str);
}

void Rus_LCD::print(const wchar_t *_str)
{
    pRusLCD->print(*_str);
}

///////////////////////////////////////////////////////////////////////////////
inline void Rus_LCD::LCD_Txt(char * cTxt, int X_Pos, int Y_Pos, bool cleaning)
{
    if (cleaning)
    {
        pRusLCD->clear();
    }
    pRusLCD->setCursor(X_Pos, Y_Pos);
    pRusLCD->print(cTxt);
}

inline void Rus_LCD::LCD_Txt(wchar_t *wTxt, int X_Pos, int Y_Pos, bool cleaning)
{
    if (cleaning)
    {
        pRusLCD->clear();
    }

    pRusLCD->setCursor(X_Pos, Y_Pos);
    pRusLCD->print(wTxt);
}

inline void Rus_LCD::LCD_Txt(String sTxt, int X_Pos, int Y_Pos,  bool cleaning)
{
    char cTxt[sTxt.length()+1];
    sTxt.toCharArray(cTxt, sTxt.length()+1);
    LCD_Txt(cTxt,X_Pos,Y_Pos, cleaning);
}

Ошибка:

C:\Users\User\AppData\Local\Temp\ccjLdAR1.ltrans0.ltrans.o: In function `setup':

D:\@DeveL@\@ArduinO@\TestLCD/TestLCD.ino:21: undefined reference to `Rus_LCD::LCD_Txt(wchar_t*, int, int, bool)'

collect2.exe: error: ld returned 1 exit status

exit status 1
Ошибка компиляции для платы Arduino/Genuino Uno.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

shuser пишет:

Класс по ссылке в исходниках -

Вы серьёзно думаете, что кому-то не лень туда лезть?

shuser пишет:

Rus_LCD расширяет класс LCD_1602_RUS. 

Кто Вам сказал?

Смотрю на строку 12 первого скетча - ничего он не расштряет, он сам по себе?

Может в этом и проблема? 

shuser
Offline
Зарегистрирован: 14.01.2016

Спасибо, уже решил изменив функции из встраиваемых на обычные. Удалил inline и заработало.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Уберите inline в строках 79, 89 и 100

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Что означает "L", в этом дефинишене ?

#define STR_START L"Старт"

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, вот, сделали на минуту раньше, чем я успел написать. Молодец! И нафига было постить, прежде, чем думать? Надо наоборот.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

У вас действительно такие названия папок?
D:\@DeveL@\@ArduinO@\

shuser
Offline
Зарегистрирован: 14.01.2016

В то время уже голова не работала и не знал даже куда копать. А здесь в визуализаторе кода на свежую голову пришла мысль, которая и сработала.

shuser
Offline
Зарегистрирован: 14.01.2016

true

sadman41
Offline
Зарегистрирован: 19.10.2016

brokly пишет:

Что означает "L", в этом дефинишене ?

#define STR_START L"Старт"

Это так символы типа  wchar_t задаются - с префиксом L.

shuser
Offline
Зарегистрирован: 14.01.2016

brokly пишет:

Что означает "L", в этом дефинишене ?

#define STR_START L"Старт"

LCD_1602_RUS.cpp

wchar_t char_utf8[] = L" ";

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

shuser пишет:

LCD_1602_RUS.cpp

wchar_t char_utf8[] = L" ";

Хранение в wchar_t - не есть UTF-8, это просто wide char.

shuser
Offline
Зарегистрирован: 14.01.2016

DIYMan пишет:

Хранение в wchar_t - не есть UTF-8, это просто wide char.

Скопировано из часто используемой библиотеки LCD_1602_RUS. Это уже к автору сей либы.