我有一个非常奇怪的问题我的库中的一些功能我用于图形LCD,它通过硬件串口与我的arduino进行通信。它只是屏幕使用的串行协议的简单包装。
基本上,每当我从这个库中调用某些函数时,我都会收到“Undefined Reference to ...”错误。但是,其他函数工作正常,我无法分辨出正在工作的函数和不工作函数之间的任何语法差异。
例如,我有一个盒子功能。当我调用它并给它四个整数时,它期望它工作正常。 fill_box
,circle
和erase_box
也是如此。
但backlight
或offset
等函数甚至是arg
之类的函数(以反映我当时的感受......)会导致代码触发未定义的引用。我无法弄清楚为什么......我的错误是什么?
以下是一个正常运行的代码示例:
#include <gLCD.h>
gLCD obj = gLCD();
void setup(){
obj.fill_box(0,0,60,60);
obj.erase_box(5,5,15,15);
obj.circle(50,50,25);
}
void loop(){delay(1000);}
但是,只要添加obj.line
之类的内容,就像这样
#include <gLCD.h>
gLCD obj = gLCD();
void setup(){
obj.fill_box(0,0,60,60);
obj.erase_box(5,5,15,15);
obj.circle(50,50,25);
obj.line(0,0,40,40);
}
void loop(){
delay(1000);
}
然后我得到一个未定义的引用。与obj.offset
,obj.blacklight
和pixel
相同。
我只是不知道为什么会这样。我开始真的气馁,我甚至不能写一个简单的图书馆...无论如何,这里是有问题的图书馆:
这是gLCD.cpp
:
#include "gLCD.h"
HardwareSerial Uart = HardwareSerial();
gLCD::gLCD(){
Uart.begin(115200);
}
void gLCD::box(int x1, int y1, int x2, int y2){
Uart.write(0x7C);
Uart.write(0x0F);
Uart.write(x1);
Uart.write(y1);
Uart.write(x2);
Uart.write(y2);
Uart.write(0x01);
}
void gLCD::fill_box(int x1, int y1, int x2, int y2){
Uart.write(0x7C);
Uart.write(0x12);
Uart.write(x1);
Uart.write(y1);
Uart.write(x2);
Uart.write(y2);
Uart.write(0xFF);
}
void gLCD::circle(int x1, int y1, int rad){
Uart.write(0x7C);
Uart.write(0x03);
Uart.write(x1);
Uart.write(y1);
Uart.write(rad);
Uart.write(0x01);
}
void gLCD::erase_block(int x1, int y1, int x2, int y2){
Uart.write(0x7C);
Uart.write(0x05);
Uart.write(x1);
Uart.write(y1);
Uart.write(x2);
Uart.write(y2);
}
void arg(){
Uart.print("this is bullsh*t!");
}
void offset(int x1, int y1){
Uart.write(0x7C);
Uart.write(0x18);
Uart.write(x1);
Uart.write(0x7C);
Uart.write(0x19);
Uart.write(y1);
}
void backlight(int duty_cycle){
Uart.write(0x7C);
Uart.write(0x02);
Uart.write(duty_cycle);
}
void line(int x1, int y1, int x2, int y2){
Uart.write(0x7C);
Uart.write(0x0C);
Uart.write(x1);
Uart.write(y1);
Uart.write(x2);
Uart.write(y2);
Uart.write(0x01);
}
void pixel(int x ,int y ,int sr){
Uart.write(0x7C);
Uart.write(0x10);
Uart.write(x);
Uart.write(y);
Uart.write(sr);
}
这是gLCD.h:
#ifndef gLCD_h
#define gLCD_h
#include <Arduino.h>
class gLCD{
public:
gLCD();
void box(int x1, int y1, int x2, int y2);
void fill_box(int x1, int y1, int x2, int y2);
void circle(int x1, int y1, int rad);
void offset(int x1, int y1);
void backlight(int duty_cycle);
void line(int x1, int y1, int x2, int y2);
void pixel(int x ,int y ,int sr);
void erase_block(int x1, int y1, int x2, int y2);
void arg();
};
#endif
答案 0 :(得分:3)
如果您在类arg()
中声明了一个函数gLCD
,那么您应该稍后将其定义为
void gLCD::arg()
{
// whatever
}
即。您必须使用明确的gLCD::
前缀来引用先前声明的函数,就像使用gLCD::box
,gLCD::circle
和其他“工作”函数一样。为什么要正确定义那些旧函数(使用gLCD::
)然后突然开始省略该前缀?
您当前在那里定义的新函数(arg
,offset
,backlight
等)被编译器视为简单的独立全局函数。它们与您的gLCD
课程无关。同时,函数gLCD::arg
,gLCD::offset
,gLCD::backlight
仍然未定义,这就是您收到这些错误的原因。
如果你想在里面定义这些新函数类定义(内联),那么你就可以在没有明确的gLCD::
前缀的情况下完成它。但是,由于您在类定义的外部,在另一个文件中,您必须使用限定名称,如gLCD::arg
。
答案 1 :(得分:0)
您忘记将gLCD::
添加到gLCD.cpp
中的某些功能中。将类前缀保留为off意味着您声明了一个全局函数而不是类成员函数。
答案 2 :(得分:0)
您的arg,偏移,背光,线条,像素函数不是作为gLCD类的一部分编写的
变化
void arg()
到
void gLCD::arg()