multiple definition of `xxxx`问题解决及其原理
来源:互联网 发布:阿里郎电影百度云 编辑:程序博客网 时间:2024/06/06 08:50
今天博主在将VS2015工程转换位为Qt工程遇到,调试到最后,出现multiple definition of `xxxx`问题,之前有遇到这问题。
做法是,把.h文件中定义的变量放到.cpp中,然后就解决了。
当时没仔细分析原因,今天又同时遇到结构出现这问题,最后也从头文件中放在源文件中,至于有没有更好的办法,目前,博主还不确定。望大神指教!
博主头文件有加条件编译的
#ifndef _TEST_H_
#define _TEST_H_
。。。
#endif
重复定义的问题,没有出在这,继续分析:(下面附一博主分析,最后附有链接,该博主分析的是.c ,本人是.cpp,完全一个道理了)
要解决这个问题先来看看变量的定义和声明的区别。
查看代码,确实我在一个.h文件中定义了一个变量,而这个.h文件被多个文件包含,单独编译都没有问题,但是到链接的时候就出现问题了。
#ifndef _TEST_H_
#define _TEST_H_
......
struct pdesc const cameractrl_params[] = {
{PT_STRI_, 0, 1, OFFSET(cameractrl, homecmd), "homecmd", 32, 0, NULL, NULL},
{PT_STRI_, 0, 1, OFFSET(cameractrl, zoomctrl), "zoomctrl", 32, 0, NULL, NULL},
{PT_STRI_, 0, 1, OFFSET(cameractrl, focusctrl), "focusctrl", 32, 0, NULL, NULL},
{PT_STRI_, 0, 1, OFFSET(cameractrl, aperturectrl), "aperturectrl", 32, 0, NULL, NULL},
{PT_NULL_, 0, 0, 0, "", 0, 0, NULL, NULL} /* PT_NULL means tail of struct pdesc array */
};
{PT_STRI_, 0, 1, OFFSET(cameractrl, homecmd), "homecmd", 32, 0, NULL, NULL},
{PT_STRI_, 0, 1, OFFSET(cameractrl, zoomctrl), "zoomctrl", 32, 0, NULL, NULL},
{PT_STRI_, 0, 1, OFFSET(cameractrl, focusctrl), "focusctrl", 32, 0, NULL, NULL},
{PT_STRI_, 0, 1, OFFSET(cameractrl, aperturectrl), "aperturectrl", 32, 0, NULL, NULL},
{PT_NULL_, 0, 0, 0, "", 0, 0, NULL, NULL} /* PT_NULL means tail of struct pdesc array */
};
......
#endif
一般在.h文件中定义一个变量声明时,在其他文件中只要包含了这个.h文件,编译的时候就会独立被编译器解释,然后每个.C文件会生成独立的标识符和符号表,所以上述代码在单独编译的时候并不会报错,语法是合法的。但是,最后在编译器链接的时候,就会将工程中所有的符号整合在一起,由于文件中有重复的变量,于是就会出现重复定义的错误,系统就是提示你“multiple definition of `xxx`”。
进一步解释,我们可以这样想象编译每一个C源文件时,相当于一条有管道包围的纵向水流,二者互不干扰。当链接时两条原本相互独立的水管横向流了,所有就出现了重复的元素。所以当进行链接时就会出现重复定义的标示符。重复定义的标示符在这里只是变量,函数不会。因为函数确实只在.c中定义了一次,多次声明是没有问题的,而变量确实出现了两次定义。两次重复的变量定义链接器就不知道该已那个地址作为变量的内存,所以报错。
怎么解决这个问题呢?
其实只需要将全局变量定义从.h文件中挪到.c文件里,然后在.h文件中用extern做外部声明即可。即在.c文件中声明变量,然后在头文件.h所有的变量声明前加上extern,注意在.h文件中就不要对变量进行初始化赋值了。然后其他需要使用全局变量的.c文件中包含.h文件即可。编译器会为.c生成目标文件,然后链接时,如果该.c文件使用了全局变量,链接器就会链接到此.c文件。其他文件需要使用此全局变量也是同样的方式,目的其实只有一个,就是使变量在内存中唯一化。
例子,上面代码如此修改就对了:
在test.c中定义
//test.c
......
struct pdesc const cameractrl_params[] = {
{PT_STRI_, 0, 1, OFFSET(cameractrl, homecmd), "homecmd", 32, 0, NULL, NULL},
{PT_STRI_, 0, 1, OFFSET(cameractrl, zoomctrl), "zoomctrl", 32, 0, NULL, NULL},
{PT_STRI_, 0, 1, OFFSET(cameractrl, focusctrl), "focusctrl", 32, 0, NULL, NULL},
{PT_STRI_, 0, 1, OFFSET(cameractrl, aperturectrl), "aperturectrl", 32, 0, NULL, NULL},
{PT_NULL_, 0, 0, 0, "", 0, 0, NULL, NULL} /* PT_NULL means tail of struct pdesc array */
};
{PT_STRI_, 0, 1, OFFSET(cameractrl, homecmd), "homecmd", 32, 0, NULL, NULL},
{PT_STRI_, 0, 1, OFFSET(cameractrl, zoomctrl), "zoomctrl", 32, 0, NULL, NULL},
{PT_STRI_, 0, 1, OFFSET(cameractrl, focusctrl), "focusctrl", 32, 0, NULL, NULL},
{PT_STRI_, 0, 1, OFFSET(cameractrl, aperturectrl), "aperturectrl", 32, 0, NULL, NULL},
{PT_NULL_, 0, 0, 0, "", 0, 0, NULL, NULL} /* PT_NULL means tail of struct pdesc array */
};
......
在test.h中定义
//test.h
#ifndef _TEST_H_
#define _TEST_H_
......
extern struct pdesc const cameractrl_params[];
......
#endif
这样,multiple definition of `xxxx`就搞明白了。
done
附:http://blog.csdn.net/mantis_1984/article/details/53571758
阅读全文
0 0
- multiple definition of `xxxx`问题解决及其原理
- multiple definition of `xxxx`问题解决及其原理
- multiple definition of XXXX
- [问题解决] multiple definition of `***'
- multiple definition of 问题解决方法
- 问题解决: multiple definition of XXX
- multiple definition of 问题解决方法
- multiple definition of 问题解决方法
- multiple definition of 问题解决方法
- multiple definition of 问题解决方法
- 全局变量 multiple definition of 问题解决方法
- "multiple definition of" 错误
- multiple definition of...
- multiple definition of...
- 解决 multiple definition of
- extern: multiple definition of
- gcc: multiple definition of
- 解决 multiple definition of
- 几种二分方法整理
- Unity Lua UI界面封装
- iOS 打开AppStore进行软件评分
- bzoj 1617(dp)
- Cannot set the value of read-only property 'outputFile'
- multiple definition of `xxxx`问题解决及其原理
- Android使用HttpURLConnection发送网络请求(笔记)
- python开发工具pycharm使用简介
- Jdbc时间类型的处理
- 内存泄漏工具
- JZOJ 5426. 【NOIP2017提高A组集训10.25】摘Galo
- CodeForces 469A. I Wanna Be the Guy set简单应用
- 聚簇因子和执行计划
- [P1280]尼克的任务