我知道之前已经多次询问过这个问题,但我无法让这个问题起作用。对于一个特殊情况,我需要有一个全局结构,它将被填充到一个文件中,并在另一个文件中读取。
以下代码给出了一个链接错误:
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;
}
必须有一些我忽略的东西。有任何想法吗?
你可以搬家
MyCameraData camera_data;
从main
到main.cpp中的全局范围,以解决链接器错误。但是,我建议创建一个文件common.cpp并在该文件中定义变量。这比在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;
}
这部分没问题:
COMMON.H
#ifndef COMMON_H
#define COMMON_H
struct MyCameraData
{
float sensor_shift;
float return_sensor_shift();
};
extern MyCameraData camera_data;
#endif
由于您在头文件中将camera_data
声明为extern
,这只是一个声明,您缺少其定义。
要修复此问题,请添加此文件:
Common.cpp
#include "Common.h"
MyCameraData camera_data;
这应该可以解决你的问题。