【发布时间】:2011-04-09 05:29:30
【问题描述】:
我的代码是 Arduinoish。我打开了详细编译,因此我可以验证所有 .o 文件确实正确地传递给了链接器,它们是(下面的链接器命令)。这让我相信这是某种语法错误。
谷歌搜索错误“未定义的函数引用”会产生很多结果,例如“像这样将 foo.o 添加到您的链接器命令”等。
我希望解决方案像缺少点或 -> 某处一样简单。
我在一个文件中收到了这一系列错误,来自链接器:
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 生成的显式临时目录路径,并将其拆分为多行。实际命令对于所有这些文件的位置都是明确的):
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 库。
【问题讨论】:
标签: c++ arduino static-members