• 8553阅读
  • 15回复

multiple definition of `m_lsRec' 问题 [复制链接]

上一主题 下一主题
离线pear_2268
 

只看楼主 正序阅读 楼主  发表于: 2009-12-28
自己封装了一个c++类CSerialPort,然后从QMainWindow派生出一个子类CMainWindow,在CMainWindow中包含CSerialPort.h,make的时候会出现CSerialPort中的变量m_lsRec' 重复定义的错误,mainwindow.o:/sss/DEVICE/SerialPort/terminal/src/mainwindow.cpp:77: multiple definition of `m_lsRec'
main.o:/usr/include/c++/4.2/bits/locale_facets.tcc:2560: first defined here
serialport.o: In function `CSerialPort':
/usr/include/c++/4.2/new:105: multiple definition of `m_lsRec'
main.o:/usr/include/c++/4.2/bits/locale_facets.tcc:2560: first defined here
moc_mainwindow.o:/sss/DEVICE/SerialPort/terminal/moc_mainwindow.cpp:48: multiple definition of `m_lsRec'
main.o:/usr/include/c++/4.2/bits/locale_facets.tcc:2560: first defined here
collect2: ld returned 1 exit status
请高手给指点一下啊,谢谢!
离线dbzhang800

只看该作者 15楼 发表于: 2009-12-29
引用第13楼pear_2268于2009-12-29 10:30发表的  :
问题找到了,因为在CSerialPort启用了线程函数,里面使用了m_lsRec,没把它声明为静态的而是全局的,所以,就出现了重复定义的,情况了,现在声明为静态的就OK了!谢谢!


static 定义的变量 ,具有文件作用域,放头文件不出错,但不是好方案。

1. 一个原则:头文件只放声明,不放定义(const 常量、inline函数、class   定义除外)。

2. 在c++ 中,一般推荐匿名 namespace 而不用 static
离线pear_2268

只看该作者 14楼 发表于: 2009-12-29
确实,我写程序的时候语法不严谨,谢谢各位的指教啊!
离线pear_2268

只看该作者 13楼 发表于: 2009-12-29
问题找到了,因为在CSerialPort启用了线程函数,里面使用了m_lsRec,没把它声明为静态的而是全局的,所以,就出现了重复定义的,情况了,现在声明为静态的就OK了!谢谢!
离线benbenmajia

只看该作者 12楼 发表于: 2009-12-29
......确实是定义了,加上extern应该没问题了
安然.....
离线dbzhang800

只看该作者 11楼 发表于: 2009-12-29
而且全局变量你加个 m_ 前缀,相当能误导人
离线benbenmajia

只看该作者 10楼 发表于: 2009-12-29
你可以把你定义的全局变量前面加上extern,你自己封装的这个类被包含的次数多了这个变量就会被重复定义
安然.....
离线dbzhang800

只看该作者 9楼 发表于: 2009-12-29
引用第7楼pear_2268于2009-12-29 10:13发表的  :
是我说的不严谨了,我是在头文件里声明的全局变量,没有对其进行定义

你前面贴的不是定义式么?
  1. list<string> m_lsRec;
离线benbenmajia

只看该作者 8楼 发表于: 2009-12-29
你调试过什么没有?
自己觉得是哪的问题可以先试试
安然.....
离线pear_2268

只看该作者 7楼 发表于: 2009-12-29
引用第6楼dbzhang800于2009-12-29 09:55发表的  :
链接错误,重复定义了,头文件只放声明,不要放定义!

是我说的不严谨了,我是在头文件里声明的全局变量,没有对其进行定义
离线dbzhang800

只看该作者 6楼 发表于: 2009-12-29
引用第5楼pear_2268于2009-12-29 09:48发表的  :
对了,list<string> m_lsRec; 这个变量是全局的,在CSerialPort.h的类外定义的

链接错误,重复定义了,头文件只放声明,不要放定义!
离线pear_2268

只看该作者 5楼 发表于: 2009-12-29
对了,list<string> m_lsRec; 这个变量是全局的,在CSerialPort.h的类外定义的
离线pear_2268

只看该作者 4楼 发表于: 2009-12-29
在CMainWindow中,我定义了一个CSerialPort *m_pPort;,在cpp中,m_pPort = new CSerialPort;问题可能出在这个对象指针的new上?难道new用错了?
离线pear_2268

只看该作者 3楼 发表于: 2009-12-29
不是,我查了应该不是这个问题
离线蛮蛮
只看该作者 2楼 发表于: 2009-12-29
头文件重复包含?
蛮蛮工作室
离线pear_2268

只看该作者 1楼 发表于: 2009-12-29
重新顶起来啊!
快速回复
限100 字节
 
上一个 下一个