Reputation: 81
I'm aware that this question has been asked multiple times before, but I can't get this to work. For a special case I need to have a global struct that will be filled in one file, and read in another.
The following code gives me a linking error:
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;
}
There must be something I'm overlooking. Any ideas?
Upvotes: 0
Views: 2335
Reputation: 7905
This part is okay:
Common.h
#ifndef COMMON_H
#define COMMON_H
struct MyCameraData
{
float sensor_shift;
float return_sensor_shift();
};
extern MyCameraData camera_data;
#endif
Since you declared camera_data
as extern
in the header file which is only a declaration you are missing its definition.
To fix this add this file:
Common.cpp
#include "Common.h"
MyCameraData camera_data;
And that should fix your problem.
Upvotes: 2
Reputation: 206577
You could move
MyCameraData camera_data;
from main
to global scope in main.cpp to resolve the linker error. However, I suggest creating a file common.cpp and defining the variable in that file. That is cleaner than defining it 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;
}
Upvotes: 2