在我的库中随机未定义的参考
Random undefined references in my library
我在我为grapical LCD库中的某些功能中遇到了一个非常奇怪的问题,该功能通过硬件序列与我的Arduino通信。这只是屏幕使用的串行协议的简单包装器。
基本上,每当我在此库中调用某些功能时,我会收到"未定义的引用..."错误。但是,其他功能效果很好,我无法辨别有效的功能与无效的句法差异。
例如,我有一个框功能。当我称其为四个整数时,它可以期望它可以正常工作。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
如果您在类gLCD
中声明函数arg()
,则应以后将其定义为
void gLCD::arg()
{
// whatever
}
即。您必须使用明确的gLCD::
前缀来参考先前声明的函数,就像您使用gLCD::box
,gLCD::circle
和其他"工作"功能一样。为什么要正确定义这些旧功能(使用gLCD::
),然后突然开始省略该前缀?
编译器将您当前在此处定义的新功能(arg
,offset
,backlight
等)视为简单的独立全局函数。他们与您的gLCD
课程无关。同时,功能gLCD::arg
,gLCD::offset
,gLCD::backlight
保持不确定,这就是为什么您会遇到这些错误。
如果您想对这些新功能定义正确的 类别定义(内联),那么您就可以在没有明确的gLCD::
前缀的情况下执行此操作。但是,由于您正在执行类定义的外部,因此在另一个文件中,您必须使用合格的名称,例如gLCD::arg
。
您忘了在gLCD.cpp
中的某些功能中添加gLCD::
。离开类前缀,意味着您声明全局函数而不是类成员函数。
您的arg,偏移,背光,行,像素函数不是作为glcd类的一部分而写的
更改
void arg()
to
void gLCD::arg()
- GTest EXPECT_EQ给出未定义的错误参考
- 在VSCode中编译C++给了我一个未定义的参考
- Armadillo正在为共享的lapack库获取未定义的参考
- 我对C++程序有一个未定义的参考,不知道如何处理它
- 使用Arduino IDE的构造函数的未定义参考错误
- 在C++中使用 CImg 的未定义参考错误
- gtest的未定义参考
- 未定义参考 cv::鱼眼::校准
- WEBRTC的未定义参考
- 如何编译ZBAR示例?(未定义参考..)
- 针对C 库链接时的未定义参考
- 命名空间外部变量的未定义参考/多重定义,C 结构问题
- 简单QT程序中的未定义参考
- 主要makefile中的未定义参考
- C 标题中的外部变量的未定义参考
- 对[class::function]的未定义引用/对[class]的typeinfo的未定义参考
- icu 54-未定义参考
- 信号上的QT未定义参考编译错误
- boost 1.58未定义参考
- QT未定义参考错误(Qextserialport)