2017-12-21 14 views
-2

Ich bin mir bewusst, dass diese Frage schon mehrmals gestellt wurde, aber ich kann das nicht funktionieren. Für einen speziellen Fall muss ich eine globale Struktur haben, die in einer Datei gefüllt und in einer anderen gelesen wird.Global struct C++

Der folgende Code gibt mir einen Verknüpfungsfehler:

Undefined symbols for architecture x86_64: 
    "_camera_data", referenced from: 
     MyCameraData::return_sensor_shift() in extra-424af5.o 
ld: symbol(s) not found for architecture x86_64 
clang-5.0: error: linker command failed with exit code 1 (use -v to see invocation) 

common.h:

#ifndef COMMON_H 
#define COMMON_H 
struct MyCameraData 
{ 
    float sensor_shift; 
    float return_sensor_shift(); 
}; 
extern MyCameraData camera_data; 
#endif 

main.cpp:

#include "common.h" 
#include <iostream> 

int main(){ 
    MyCameraData camera_data; 

    camera_data.sensor_shift = 5.0; 

    std::cout << camera_data.return_sensor_shift() << std::endl; 
} 

extra.cpp:

#include "common.h" 

float MyCameraData::return_sensor_shift(){ 
    return camera_data.sensor_shift; 
} 

Da muss etwas sein, das ich übersehe. Irgendwelche Ideen?

+5

Sie haben 'camera_data' als' extern' deklariert, was bedeutet "vertraue mir, es ist an anderer Stelle definiert". Aber du hast es nirgends definiert. –

+1

Mögliches Duplikat von [Was ist ein undefinierter Verweis/ungelöster externer Symbolfehler und wie behebe ich ihn?] (Https://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-) symbol-error-and-how-do-i-fix) – user0042

+0

Prost, das war es. Anfängerfehler! –

Antwort

2

Sie könnten

MyCameraData camera_data; 

von main zu globalem Bereich in main.cpp bewegen, um die Linker-Fehler zu beheben. Ich empfehle jedoch, eine Datei common.cpp zu erstellen und die Variable in dieser Datei zu definieren. Das ist sauberer als das Definieren in main.cpp.

common.cpp:

#include "common.h" 
MyCameraData camera_data; 

main.cpp:

#include "common.h" 
#include <iostream> 

int main() 
{ 
    camera_data.sensor_shift = 5.0; 
    std::cout << camera_data.return_sensor_shift() << std::endl; 
} 
1

Dieser Teil ist in Ordnung:

COMMON.H

#ifndef COMMON_H 
#define COMMON_H 
struct MyCameraData 
{ 
    float sensor_shift; 
    float return_sensor_shift(); 
}; 
extern MyCameraData camera_data; 
#endif 

S Ince Sie deklariert camera_data als extern in der Header-Datei, die nur eine Erklärung ist, die Sie ihre Definition fehlt.

Um dies zu beheben diese Datei hinzufügen:

Common.cpp

#include "Common.h" 
MyCameraData camera_data; 

Und das sollte Ihr Problem beheben.