我的库中随机未定义的引用

时间:2012-10-25 23:56:44

标签: c++ arduino

我有一个非常奇怪的问题我的库中的一些功能我用于图形LCD,它通过硬件串口与我的arduino进行通信。它只是屏幕使用的串行协议的简单包装。

基本上,每当我从这个库中调用某些函数时,我都会收到“Undefined Reference to ...”错误。但是,其他函数工作正常,我无法分辨出正在工作的函数和不工作函数之间的任何语法差异。

例如,我有一个盒子功能。当我调用它并给它四个整数时,它期望它工作正常。 fill_boxcircleerase_box也是如此。

backlightoffset等函数甚至是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.offsetobj.blacklightpixel相同。

我只是不知道为什么会这样。我开始真的气馁,我甚至不能写一个简单的图书馆...无论如何,这里是有问题的图书馆:

这是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

3 个答案:

答案 0 :(得分:3)

如果您在类arg()中声明了一个函数gLCD,那么您应该稍后将其定义为

void gLCD::arg() 
{
  // whatever
}

即。您必须使用明确的gLCD::前缀来引用先前声明的函数,就像使用gLCD::boxgLCD::circle和其他“工作”函数一样。为什么要正确定义那些旧函数(使用gLCD::)然后突然开始省略该前缀?

您当前在那里定义的新函数(argoffsetbacklight等)被编译器视为简单的独立全局函数。它们与您的gLCD课程无关。同时,函数gLCD::arggLCD::offsetgLCD::backlight仍然未定义,这就是您收到这些错误的原因。

如果你想在里面定义这些新函数类定义(内联),那么你就可以在没有明确的gLCD::前缀的情况下完成它。但是,由于您在类定义的外部,在另一个文件中,您必须使用限定名称,如gLCD::arg

答案 1 :(得分:0)

您忘记将gLCD::添加到gLCD.cpp中的某些功能中。将类前缀保留为off意味着您声明了一个全局函数而不是类成员函数。

答案 2 :(得分:0)

您的arg,偏移,背光,线条,像素函数不是作为gLCD类的一部分编写的

变化

void arg()

void gLCD::arg()