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