La résolution d'un linker error: undefined reference pour les membres de classe statiques
Mon code est Arduinoish. J'ai allumé détaillé de la compilation j'ai donc pu vérifier que tous les .o fichiers sont en effet passé à l'éditeur de liens correctement, et ils sont (commande liens ci-dessous). Ce qui m'amène à croire que c'est une sorte d'erreur de syntaxe.
Googler pour l'erreur "undefined reference to en fonction de" produit beaucoup de résultats avec des réponses comme "ajouter foo.o pour votre commande liens comme si", etc.
J'espère que la solution est aussi simple que d'un manque de point -> quelque part.
Je suis cette série d'erreurs dans un fichier, à partir de l'éditeur de liens:
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'
L' .h fichier:
#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
et la .fichier 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
L'éditeur de liens de commande (j'ai supprimé l'explicite répertoire temporaire chemins que l'IDE génère pour plus de clarté et brisé à plusieurs lignes. La commande est explicite quant à l'emplacement de l'ensemble de ces fichiers):
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
Tous ces fichiers (SerialServoControl, Wheel_Chair_Joystick, NewSoftSerial, WheelChairMotor) existent dans l'Arduino esquisse répertoire. Core.a
est compilé AVR bibliothèque.
OriginalL'auteur voxobscuro | 2011-04-09
Vous devez vous connecter pour publier un commentaire.
Vous devez définir votre classe statique dans un fichier de source de certains où les. Les mettre dans la classe déclare simplement qu'ils sont là, mais quelque chose reste à définir.
À l'intérieur de votre
.cpp
fichier, vous pouvez le faire comme ceci:Mettre des valeurs initiales appropriées; j'ai supposé que le commentaire était pour le constructeur.
Vous pouvez toujours avoir un
init
fonction, poule, vous pouvez avoir besoin d'uneinit
fonctionNewSoftSerial
. À l'aide d'un pointeur doit également résoudre votre problème; vous devez créer l'objet dans leinit
fonction.aha! Je crois que j'ai réglé maintenant. Merci encore pour votre aide prompte. Je suis encore un peu vert sur le C++ avant, mais j'apprends vite. J'upload le code pour tester maintenant.
OriginalL'auteur edA-qa mort-ora-y
Vous avez besoin pour créer de la mémoire et de l'initialiser vos variables statiques.
Dans votre fichier CPP ajouter les éléments suivants:
OriginalL'auteur Victor Parmar
Parce que la valeur _serial est statique, il existe quand un objet n'est pas instancié.
Cela signifie que vous doit de le déclarer dans le code comme
qui a déjà été suggéré.
Ensuite, si vous voulez modifier dans la fonction init, il vous suffit de changer votre
_serial = ...
ligneSerialServoControl::_serial = NewSoftSerial(tx, rx).
Bien sûr, cela signifie que vous aurez à définir une pertinente constructeur de la NewSoftSerial classe.
Espère que cette aide.
OriginalL'auteur Ben Stott
Je sais que c'est un peu mort, mais dans mon cas, j'ai oublié de définir les méthodes, j'ai été référencement, imaginez que.......
Oui elles ont été DÉCLARÉES, mais quand j'ai vérifié mon .fichier cpp, il n'y a pas de définition, de sorte que cette fois, l'erreur a été littéral.
OriginalL'auteur MDMoore313