全局向量变量的外部不起作用

时间:2017-02-27 13:54:35

标签: c++ global-variables extern

我正在尝试将矢量变量用作全局,并将其外部用于另一个文件中,这是我的代码

标题文件:

using namespace cv;

typedef struct objectparamstruct
{
  std::vector<KeyPoint> kp_object;
  Mat des_object;
  char label[10];
}objectparamstruct;

我的头文件没有矢量变量的定义。

Main.cpp的

std::vector<Point2f> obj_corners(4);

functions.cpp

extern std::vector<Point2f> obj_corners(4);

但是我收到以下错误:

errorLNK:2005:.....already defined in functions.obj 
errorLNK1169: one or more multiply defined symbols found

我是C ++的新手,有人可以帮助我。

3 个答案:

答案 0 :(得分:2)

extern std::vector<Point2f> obj_corners(4);

是一个定义,因为您提供了初始化程序。在您的计划中多次定义obj_corner会伤害odr-rule。相反,为了遵循odr规则,你想要的是一个声明:

functions.cpp

extern std::vector<Point2f> obj_corners;

这只是将对象的名称obj_corners引入您的翻译单元,告诉链接器它是在另一个翻译单元中定义的(在这种情况下是main.cpp)。

答案 1 :(得分:1)

定义应如下所示:

 std::vector<Point2f> obj_corners(4);

和这样的extern声明:

 extern std::vector<Point2f> obj_corners;

第一个语句实际上是使用构造函数来创建向量,而第二个语句只是说向量存在于某个地方。

答案 2 :(得分:0)

变化

extern std::vector<Point2f> obj_corners(4);         //definition

extern std::vector<Point2f> obj_corners;            //declaration

因为extern std::vector<Point2f> obj_corners(4);定义,因为您提供了初始值设定项。你需要的是一个声明,只是为了让程序知道该向量存在于该程序的其他地方。