【发布时间】:2017-06-02 13:05:14
【问题描述】:
我正在使用 Qt/MinGW/Windows 进行一个大型项目。最近我把我的一些源文件的地方改了,重新编译,经过一些修正,开始收到这样的消息
(.idata$5+0x0):-1: error: multiple definition of `_imp___ZN9QwtThermo16staticMetaObjectE'
这发生在两个类中:QwtThermo 和 QwtPlotPicker 在以前没有此类错误的代码中(请记住:我只是将基本文件夹中文件的位置更改为一些子文件夹;没有更改代码(据我记得) 并注意许多其他 Qwt 类也包括在内,并且通常在没有任何编译错误的情况下使用;这是唯一给我带来问题的两个)。
现在“多重定义”是 C++ 中的一个常见错误,我已经知道通常如何解决它(包括 StackOverflow 在内的许多线程都在谈论它):一个人应该只在头文件中声明内容,同时在头文件中定义它们.cpp 文件。
不幸的是,这一次似乎不是一个可行的解决方案。这是发生了什么:
- 我对包含此标头的位置进行了研究,但没有发现任何问题。我很伤心,它以前编译得很好。
- 如果我创建了 QwtPlotPicker 的子类(我是否使用它无关紧要),问题只会出现在 QwtPlotPicker 上。如果我只在头文件中声明子类的名称并在.cpp中定义它,那么我可以编译,但是一旦我开始使用它(在头文件中声明了一个成员指针),然后编译出现错误“'vtable for Picker'的未定义引用”。所以在头文件中声明类并在 .cpp 中定义它实际上并没有帮助;
- 使用 QwtThermo,如果我在头文件中包含文件并且只声明指向它的指针(无子类),则错误已经开始出现。如果我只在项目的标头中声明 QwtThermo 类并在 .cpp 文件中包含 QwtThermo 自己的标头,则可以解决此问题;这样我就可以声明一个指向它的成员指针,并在它的父类中的 .cpp 文件中用“new”实例化指针,但是一旦我通过调用它的方法开始使用它,“多重定义" 再次开始出现。
如您所见,这一次似乎不仅仅是“在标头中声明并在 .cpp 中定义”的问题;更多的事情正在发生。 :T
那么可能出了什么问题?抱歉没有发布任何代码,但请相信我已经编写了所有可以看到的有趣内容;发布代码的唯一变化是复制超过 5000 行 ^^
很高兴你能给我任何帮助:)
谢谢,
编辑:这是来自 Qt Creator 的“编译输出”的代码:
g++ -c -pipe -fno-keep-inline-dllexport -g -frtti -Wall -Wextra -fexceptions -mthreads -DUNICODE -DMGENERALDEFINES_GUI -DMGENERALDEFINES_DEBUG -DMGENERALDEFINES_GENERAL -DQWT_INCLUDED -DDEBUG -DRELEASE -DQT_NO_DEBUG -DQT_NO_DEBUG_OUTPUT -DQT_PRINTSUPPORT_LIB -DQT_MULTIMEDIA_LIB -DQT_WIDGETS_LIB -DQT_SQL_LIB -DQT_NETWORK_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_NEEDS_QMAIN -I. -I"MSHARE_REPO" -I"MSHARE_COMMON" -I"C:\Qt\Qwt-6.1.0\include" -I"C:\Qt\Qt5.2.1\5.2.1\mingw48_32\include" -I"C:\Qt\Qt5.2.1\5.2.1\mingw48_32\include\QtPrintSupport" -I"C:\Qt\Qt5.2.1\5.2.1\mingw48_32\include\QtMultimedia" -I"C:\Qt\Qt5.2.1\5.2.1\mingw48_32\include\QtWidgets" -I"C:\Qt\Qt5.2.1\5.2.1\mingw48_32\include\QtSql" -I"C:\Qt\Qt5.2.1\5.2.1\mingw48_32\include\QtNetwork" -I"C:\Qt\Qt5.2.1\5.2.1\mingw48_32\include\QtGui" -I"C:\Qt\Qt5.2.1\5.2.1\mingw48_32\include\QtCore" -I"build\moc" -I"build\ui" -I"C:\Qt\Qt5.2.1\5.2.1\mingw48_32\mkspecs\win32-g++" -o build\obj\moc_mainwindow.o build\moc\moc_mainwindow.cpp
g++ -Wl,-subsystem,windows -mthreads -o debug\mShare.exe object_script.mShare.Debug -lglu32 -lopengl32 -lgdi32 -luser32 -lmingw32 -lqtmaind "D:/Minhas obras/Softwares/mShare Project/mShare/SMTPEmail.dll" -lpsapi C:/Qt/Qwt-6.1.0/lib/qwtd.dll "D:/Minhas obras/Softwares/mShare Project/mShare/../../Classes/mLogger/build/debug/mLogger.dll" "D:/Minhas obras/Softwares/mShare Project/mShare/../mShareLib/build/debug/mShareLib.dll" C:/Qt/Qwt-6.1.0/lib/qwt.dll "D:/Minhas obras/Softwares/mShare Project/mShare/../../Classes/mLogger/build/release/mLogger.dll" "D:/Minhas obras/Softwares/mShare Project/mShare/../mShareLib/build/release/mShareLib.dll" -LC:\Qt\Qt5.2.1\5.2.1\mingw48_32\lib -lQt5PrintSupportd -lQt5Multimediad -lQt5Widgetsd -lQt5Sqld -lQt5Networkd -lQt5Guid -lQt5Cored .\build\obj\icone_res.o
d000171.o:(.idata$5+0x0): multiple definition of `_imp___ZN13QwtPlotPicker16staticMetaObjectE'
d000022.o:(.idata$5+0x0): first defined here
d000171.o:(.idata$6+0x0): multiple definition of `_nm___ZN13QwtPlotPicker16staticMetaObjectE'
d000022.o:(.idata$6+0x0): first defined here
d000172.o:(.idata$5+0x0): multiple definition of `_imp___ZN9QwtThermo16staticMetaObjectE'
d000102.o:(.idata$5+0x0): first defined here
d000172.o:(.idata$6+0x0): multiple definition of `_nm___ZN9QwtThermo16staticMetaObjectE'
Makefile.Debug:246: recipe for target 'debug\mShare.exe' failed
d000102.o:(.idata$6+0x0): first defined here
collect2.exe: error: ld returned 1 exit status
mingw32-make[1]: [debug\mShare.exe] Error 1 (ignored)
【问题讨论】:
-
您是否尝试过删除所有目标文件并从头开始重新编译?
-
@user657267 多次:T
-
您可以复制文件而不是移动文件,这将解释多重定义错误。至于未定义的 vtable,您缺少成员函数的定义,或者可能没有将相关对象传递给链接器。
-
@n.m.感谢您的评论。好吧,这当然是我从未检查过的一种可能性,尽管我不会打赌(即使我已经复制而不是移动,我也不会在我的源代码中包含两次,我在这里没有我知道,所以我稍后会检查)。顺便说一句,如果这是问题所在,难道更多的课程不会出现同样的问题吗?请记住,我通常使用许多 Qwt 类,更不用说我自己的类了,只有那两个有问题。关于 vtable,我敢打赌这是普遍问题的结果;没有使用虚函数。