C++:LNK2005:xxx already defined in main.obj

问题描述

  使用一个全局变量测试多线程同时访问一个变量的性能,结果却报错了
在这里插入图片描述
  多重定义了,于是顺藤摸瓜,找到了变量thread_index的位置

// MyThread.h

int thread_index = 0;

  以及使用这个变量的地方——

// Source.cpp
#include"MyThread.h"
...
int main(){
	...
	thread_index++;
	...
}

  原来是全局变量的使用方式错了。在创建thread_index变量的时候,使用int thread_index = 0声明并初始化,其实是声明+定义 两个过程。然后再使用#include预编译指令扩展到其他文件,实际上相当于多处定义了。

问题解决方案

  解决这个问题有两个方法——

  • 使用extern关键字,正确使用全局变量的外部引用
  • 使用static关键字

第一种方法

  在头文件中声明该变量时,加上 extern 关键字,表明该变量具有 外部链接性

//MyThread.h
extern int thread_index;

  然后在任意cpp文件中定义该变量

//MyThread.cpp
int thread_index = 0;

  最后通过#include预编译指令或者直接使用声明该变量的方式在目标代码块中使用:

//Source.cpp
#include"MyThread.h"
// 或者 extern int thread_index;
...
int main(){
	...
	thread_index++;
	...
}

  问题解决。

第二种方法

// MyThread.h
static int thread_index = 0;

  可以直接在目标代码块中使用。但要注意的是,这与第一种方法的作用是完全不同的,static限定了全局变量的链接性为文件内部链接性,即该全局变量只在本文件内有效,然后通过#include使用该变量时,会将多个static全局变量复制到不同的文件中,彼此相互独立,因此不会造成二义性,但同时该变量本质上已经失去全局变量的意义。
在这里插入图片描述

参考链接

全局变量引起的LNK2005 https://blog.csdn.net/zwlhoho/article/details/50571275
static 关键字的总结 https://www.cnblogs.com/33debug/p/7223869.html

发布了222 篇原创文章 · 获赞 558 · 访问量 38万+

猜你喜欢

转载自blog.csdn.net/CV_Jason/article/details/89839609