解决链接器错误:对静态类成员的未定义引用 [英] Resolving a linker error: undefined reference to static class members

查看:33
本文介绍了解决链接器错误:对静态类成员的未定义引用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的代码是 Arduinoish.我打开了详细编译,所以我可以验证所有 .o 文件确实正确传递给链接器,它们是(下面的链接器命令).这让我相信这是某种语法错误.

My code is Arduinoish. I turned on verbose compiling so I could verify that all the .o files are indeed getting passed to the linker correctly, and they are (linker command below). This leads me to believe that it is some sort of syntax error.

谷歌搜索错误undefined reference to in function"会产生很多结果,例如像这样将 foo.o 添加到你的链接器命令"等.

Googling for the error "undefined reference to in function" produces a lot of results with answers like "add foo.o to your linker command like so", etc.

我希望解决方案就像缺少点或 -> 某处一样简单.

I hope the solution is as simple as a missing dot or -> somewhere.

我在一个文件中收到了来自链接器的一系列错误:

I'm getting this series of errors in one file, from the linker:

SerialServoControl.cpp.o: In function `SerialServoControl::send(int, int)':
SerialServoControl.cpp:31: undefined reference to `SerialServoControl::_serial'
SerialServoControl.cpp:31: undefined reference to `SerialServoControl::_serial'
SerialServoControl.cpp.o: In function `SerialServoControl::init(char, char)':
SerialServoControl.cpp:9: undefined reference to `SerialServoControl::_tx'
SerialServoControl.cpp:10: undefined reference to `SerialServoControl::_rx'

.h 文件:

#ifndef SERIALSERVOCONTROL_H
#define SERIALSERVOCONTROL_H

#include "NewSoftSerial.h"

class SerialServoControl {
    public:
          //                             rx, tx
          static NewSoftSerial _serial;//(9, 8);

          int _servo_id;
          static char _tx;
          static char _rx;

          static void init(char tx, char rx);
          static void send(int servo_id, int angle);
          void setup(int servo_id);
          void set(int spot);
};

#endif

和 .cpp 文件:

#ifndef SERIALSERVOCONTROL_CPP
#define SERIALSERVOCONTROL_CPP

#include "WProgram.h"
#include "SerialServoControl.h"

//static
void SerialServoControl::init(char tx, char rx){
    _tx = tx;
    _rx = rx;
    _serial = NewSoftSerial(rx, tx);
    _serial.begin(9600);
}

//static
void SerialServoControl::send(int servo_id, int angle){
    unsigned char buff[6];

    int temp     = angle & 0x1f80;
    char pos_hi  = temp >> 7;
    char pos_low = angle & 0x7f;

    buff[0] = 0x80;        // start byte
    buff[1] = 0x01;        // device id
    buff[2] = 0x04;        // command number
    buff[3] = servo_id;       // servo number
    buff[4] = pos_hi;      // data1
    buff[5] = pos_low;     // data2

    for(int i=0; i<6; i++){
        _serial.print(buff[i], BYTE);

    }
}


void SerialServoControl::setup(int servo_id){
    _servo_id = servo_id;
}

void SerialServoControl::set(int angle){
    SerialServoControl::send(_servo_id, angle);
}

#endif

链接器命令(为了清晰起见,我已经删除了 IDE 生成的显式临时目录路径,并将其分解为多行.实际命令对于所有这些文件的位置是明确的):

The linker command (I've removed the explicit temporary directory paths that the IDE generates for clarity and broken it out to multiple lines. The actual command is explicit as to the location of all these files):

  avr-gcc -Os -Wl,--gc-sections -mmcu=atmega328p \
  -o Wheel_Chair_Joystick_Control.cpp.elf \
  SerialServoControl.cpp.o \
  Wheel_Chair_Joystick_Control.cpp.o \
  WheelChairMotor.cpp.o \
  NewSoftSerial.cpp.o \
  core.a \
  -Lbuild277668752723095706.tmp \
  -lm

所有这些文件(SerialServoControl、Wheel_Chair_Joystick、NewSoftSerial、WheelChairMotor)都存在于 Arduino sketch 目录.Core.a 是编译好的 AVR 库.

All of these files (SerialServoControl, Wheel_Chair_Joystick, NewSoftSerial, WheelChairMotor) exist in the Arduino sketch directory. Core.a is the compiled AVR library.

推荐答案

您必须在源文件中的某处定义您的类静态.将它们放在类中只是声明它们在那里,但仍然需要定义它们.

You have to define your class statics in a source file some where. Putting them in the class just declares that they are there, but something still needs to define them.

在您的 .cpp 文件中,您可以这样做:

Inside your .cpp file your can do so like this:

NewSoftSerial SerialServoControl::_serial(9, 8);
char SerialServoControl::_tx = 0;
char SerialServoControl::_rx = 0;

设置合适的初始值;我只是假设评论是针对构造函数的.

Put appropriate initial values; I just assumed the comment was for the constructor.

这篇关于解决链接器错误:对静态类成员的未定义引用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆