全局结构c ++

时间:2017-12-21 18:51:26

标签: c++ struct linker global

我之前已经多次询问过这个问题,但我无法解决这个问题。对于一个特殊情况,我需要有一个全局结构,它将被填充到一个文件中,然后在另一个文件中读取。

以下代码给出了一个链接错误:

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;
}

必须有一些我可以忽视的东西。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

你可以移动

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;
}

答案 1 :(得分:2)

这部分没问题:

<强> 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;

这应该可以解决你的问题。