2017-01-12 3 views
-1

Ich weiß, ähnliche Frage wurde überall gepostet, aber alle, die ich mir angesehen habe, davon ausgehen, dass die Variable in einer Klasse existiert. Ich habe eine ähnliche Sache versucht, nur die Klasse Teil zu entfernen, aber immer noch die gleiche Fehlermeldung erhalten:undefined Verweis auf statische Variable, keine Klasse

TestController.cpp:(.text+0xd0): undefined reference to `vio::HORIZONTAL_MOTOR' 

vio.h

#ifndef VIO_H 
#define VIO_H 
namespace vio 
{ 
     ... 
     extern TransistorTuple HORIZONTAL_MOTOR; 
     extern TransistorTuple FRONT_MOTOR; 
     extern TransistorTuple BACK_MOTOR; 
     ... 

vio.cpp

... 
void vio::initialize() 
{ 
     // Define variables 
     vio::TransistorTuple HORIZONTAL_MOTOR; 
     vio::TransistorTuple FRONT_MOTOR; 
     vio::TransistorTuple BACK_MOTOR; 
     ... 
} 

TestController.cpp

... 
void test::moveChair() 
{ 
     // Define variables 
     vio::TransistorTuple HORIZONTAL_MOTOR; 
     vio::TransistorTuple FRONT_MOTOR; 
     vio::TransistorTuple BACK_MOTOR; 
     ... 
} 

Die Definition funktioniert gut in vio.cpp, aber wenn ich das gleiche in TestController.cpp mache, gibt es einen Fehler. Ich schließe vi.h in TestController ein.

+0

Da dies offensichtlich einige eingebetteten Code ist, wäre der Compiler hilfreich (viele eingebettete Compiler saugen;)). Aber ... in vio.cpp sollten Sie die gleiche '' namespace vio {...} '' Anweisung haben und dann brauchen Sie das Präfix nicht für jede der Variablen. Vielleicht wird Ihr Compiler dann verstehen ... – BitTickler

+0

Ich kompiliere mit cmake auf Linux. vio.cpp ist gut verlinkt, der andere weiß nicht, was passiert. – DSchana

+0

Off topic ein wenig: Normalerweise ist es eine schlechte Idee, globale Variablen zu verwenden. Vielleicht willst du die ganze Sache überdenken. – BitTickler

Antwort

1

Wenn die Membervariable statisch ist, müssen Sie für eine statische (nicht in irgendeiner Funktion) Erklärung liefern:

vio::TransistorTuple HORIZONTAL_MOTOR = (some value); 
1

In vio.h Sie erklären extern Variablen innerhalb des Namens vio.

Als solcher, wenn Sie möchten diese Variablen in vio.cpp definieren, können Sie nicht tun, dass im Inneren der vio::initialize() Funktion.

Normalerweise vio.cpp würde so aussehen:

#include <vio.h> 
namespace vio { 
    TransistorTuple HORIZONTAL_MOTOR = { /* however that type is initialized */ }; 
    void initialize() { 
     // whatever this function does when called... 
    } 
} 

Der obige Code würde HORIZONTAL_MOTOR machen ein so initvar genannt. Der Startup-Code vor main(), der oft als crt0.cpp oder ähnliches bezeichnet wird und normalerweise mit der Compiler-Werkzeugkette bereitgestellt wird, ist dafür verantwortlich, das Recht zu bekommen (Konstruktoren von Initvars aufzurufen).

Nun müssen Sie abhängig von Ihrer Werkzeugkette möglicherweise Ihre Projektkonfiguration korrigieren. Manchmal verwenden Leute einen alten C-bezogenen Startup-Code, der "vergisst", die Initialisierung durchzuführen. Aber wenn das in Ihrem Fall so ist, können Sie diesen Fehler mit einer benutzerdefinierten initialize() Funktion nicht umgehen. Sie müssen Ihre Projekt-/Build-Tool-Kette reparieren.