Ошибка компиляции: undefined reference to
- Войдите на сайт для отправки комментариев
Чт, 14/12/2017 - 04:10
Доброго времени суток.
Создал новый класс, но некоторые методы недоступны. Не могу понять в какую степь копать, коли одни методы вызываются нормально, другие же жалуют на 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...)
А класса-то почему нет? И полного сообщения об ошибке?
Класс по ссылке в исходниках -
#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); }Ошибка:
Класс по ссылке в исходниках -
Rus_LCD расширяет класс LCD_1602_RUS.
Кто Вам сказал?
Смотрю на строку 12 первого скетча - ничего он не расштряет, он сам по себе?
Может в этом и проблема?
Спасибо, уже решил изменив функции из встраиваемых на обычные. Удалил inline и заработало.
Уберите inline в строках 79, 89 и 100
Что означает "L", в этом дефинишене ?
#define STR_START L"Старт"
Ну, вот, сделали на минуту раньше, чем я успел написать. Молодец! И нафига было постить, прежде, чем думать? Надо наоборот.
У вас действительно такие названия папок?
D:\@DeveL@\@ArduinO@\
В то время уже голова не работала и не знал даже куда копать. А здесь в визуализаторе кода на свежую голову пришла мысль, которая и сработала.
true
Что означает "L", в этом дефинишене ?
#define STR_START L"Старт"
Это так символы типа wchar_t задаются - с префиксом L.
Что означает "L", в этом дефинишене ?
#define STR_START L"Старт"
Хранение в wchar_t - не есть UTF-8, это просто wide char.
Хранение в wchar_t - не есть UTF-8, это просто wide char.
Скопировано из часто используемой библиотеки LCD_1602_RUS. Это уже к автору сей либы.