unresolved external symbol "public: static struct QMetaObject const staticMetaObject"
-
@JonB i use qt extensions to link qt with visual studio and this is my msvc log when i rebuild
Build started at 5:24 CH... 1>------ Build started: Project: project, Configuration: Debug x64 ------ 1>Reading Qt configuration (E:/Qt/6.6.2/msvc2019_64/bin/qmake) 1>uic workspace.ui 1>uic mainw.ui 1>moc mainw.h 1>moc control.h 1> G:\project\project\mainw.h(8:1): note: No relevant classes found. No output generated. 1>main.cpp 1>mainw.cpp 1>moc_mainw.cpp 1>moc_control.cpp 1>main.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const Mainw::staticMetaObject" (?staticMetaObject@Mainw@@2UQMetaObject@@B) 1>mainw.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const Mainw::staticMetaObject" (?staticMetaObject@Mainw@@2UQMetaObject@@B) 1>main.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const Workspace::staticMetaObject" (?staticMetaObject@Workspace@@2UQMetaObject@@B) 1>mainw.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const Workspace::staticMetaObject" (?staticMetaObject@Workspace@@2UQMetaObject@@B) 1>mainw.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __cdecl Mainw::metaObject(void)const " (?metaObject@Mainw@@UEBAPEBUQMetaObject@@XZ) 1>mainw.obj : error LNK2001: unresolved external symbol "public: virtual void * __cdecl Mainw::qt_metacast(char const *)" (?qt_metacast@Mainw@@UEAAPEAXPEBD@Z) 1>mainw.obj : error LNK2001: unresolved external symbol "public: virtual int __cdecl Mainw::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Mainw@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z) 1>mainw.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __cdecl Workspace::metaObject(void)const " (?metaObject@Workspace@@UEBAPEBUQMetaObject@@XZ) 1>mainw.obj : error LNK2001: unresolved external symbol "public: virtual void * __cdecl Workspace::qt_metacast(char const *)" (?qt_metacast@Workspace@@UEAAPEAXPEBD@Z) 1>mainw.obj : error LNK2001: unresolved external symbol "public: virtual int __cdecl Workspace::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Workspace@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z) 1>G:\project\x64\Debug\project.exe : fatal error LNK1120: 8 unresolved externals 1>Done building project "project.vcxproj" -- FAILED. ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== ========== Build completed at 5:24 CH and took 08,659 seconds ==========
-
@a_coder said in unresolved external symbol "public: static struct QMetaObject const staticMetaObject":
G:\project\project\mainw.h(8:1): note: No relevant classes found. No output generated.
I think this looks to be the issue to me. If that indicates that moc did not think your
mainw.h
did not have recognisableQ_OBJECT
macros that would be a problem. I think yourmainw.h
does have these correctly, so I'm not sure why, but assume the error message is telling us it's a problem.You have done some hand-coding here, and some if it is not right. For example,:
-
Any
#ifndef MAINWINDOW_H
should be right at the start of the header, but you have preceded it by your own'#include
s. Though I don't think this would cause your error. But it might do if you have done this in other.h
files likecontrol.h
. -
You use
<...>
in#include <ui_mainw.h>
, but you should not. It is not a "system" include. It should be#include "ui_mainw.h"
. But again I don't think this would cause your error (though you should change it nonetheless, if there is then a problem something is wrong). -
You have
#include <ui_forcus.h>
inmainw.h
. Butui_....h
files are only for including into their corresponding.cpp
file. This is more worrying, I don't know what effect that might have.
If you cannot get past this, I would suggest you reduce your project to only having the
Mainw
class. Stop including/compiling/linking anything but the...mainw...
files. And although it should work to have multipleQ_OBJECT
classes in yourmainw.h
file you might get rid of the extraWorkspace
class while you are having the problem. Get that working. Then add back in the other stuff. You could create a brand new, standalone project with nothing but aMainWindow
form and verify that links correctly. -
-
@a_coder what has this to do with the problem? Make sure you don't have a second header file named the same way somewhere around.
-
@Christian-Ehrlicher of course i don’t have another one named same
-
@a_coder then cleanup your include and move the ifdef to the top
-
after some edit of my code i think i fixed it but i got some another errors:
1>G:\project\project\control.h(76,7): error C2143: syntax error: missing ';' before '*' 1>(compiling source file 'x64/Debug/moc/moc_mainw.cpp') 1>G:\project\project\control.h(76,7): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 1>(compiling source file 'x64/Debug/moc/moc_mainw.cpp') 1>G:\project\project\control.h(76,14): error C2238: unexpected token(s) preceding ';' 1>(compiling source file 'x64/Debug/moc/moc_mainw.cpp') 1>G:\project\project\control.h(50,15): error C2061: syntax error: identifier 'Mainw' 1>(compiling source file 'x64/Debug/moc/moc_mainw.cpp') 1>G:\project\project\control.h(50,27): error C2612: trailing ')' illegal in base/member initializer list 1>(compiling source file 'x64/Debug/moc/moc_mainw.cpp') 1>G:\project\project\mainw.h(12,2): warning C4081: expected ')'; found 'string' 1>(compiling source file 'x64/Debug/moc/moc_mainw.cpp') 1>G:\project\project\x64\Debug\moc\moc_mainw.cpp(32,1): warning C4081: expected ')'; found 'string' 1>G:\project\project\x64\Debug\moc\moc_mainw.cpp(160,1): error C1004: unexpected end-of-file found 1>Done building project "project.vcxproj" -- FAILED. 1>Done building project "project.vcxproj" -- FAILED.
i think workspace and mainw class isn't defined in control class although i inclued it
my control.h#ifndef CONTROLER_H #define CONTROLER_H #include <qobject.h> #include <qtimer.h> #include <qobject.h> #include "mainw.h" #include "workspace.h" class Timer :public QObject { Q_OBJECT public: Timer(long long ×etup, QObject* parent = nullptr) :QObject(parent) ,counter(new QTimer) { timereaining = ×etup; connect(counter, &QTimer::timeout, this, &Timer::sendupdate); } void start() { counter->setInterval(1000); counter->start(); } signals: void requestupdated(long long remainsecond); void timeout(); private slots: void sendupdate() { if (*timereaining <= 0) { emit timeout(); } else { (*timereaining)--; emit requestupdated(*timereaining); } } private: long long* timereaining; QTimer* counter; }; class control :public QObject { Q_OBJECT public: control(Timer* time, QObject* parent = nullptr): QObject(parent) ,timer(time) , workspace(new Workspace(timer)) , mainw(new Mainw(timer)) { /*mainw = new Mainw(timer); workspace = new Workspace(timer);*/ } ~control() { } void start() { connect(mainw, &Mainw::change_gui, this, &control::changeto_workspace_slot); connect(workspace, &Workspace::change_gui, this, &control::changeto_mainw_slot); mainw->start(); } //signals: //void changeto_mainw(); //void changeto_workspace(); private slots: void changeto_mainw_slot() { mainw->start(); workspace->close(); } void changeto_workspace_slot() { workspace->start(); mainw->close(); } private: Timer* timer; Mainw* mainw; Workspace* workspace; }; #endif // CONTROLER_H
and i detached mainw and workspace and put it to different header file
-
@a_coder said in unresolved external symbol "public: static struct QMetaObject const staticMetaObject":
1>G:\project\project\control.h(76,7): error C2143: syntax error: missing ';' before '*'
1>(compiling source file 'x64/Debug/moc/moc_mainw.cpp')
1>G:\project\project\control.h(76,7): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>(compiling source file 'x64/Debug/moc/moc_mainw.cpp')So, what is in these lines in control.h?
And what is the very first error? -
apart from the really strange usage of reference and pointers to this reference which will likely not work, don't use 'long long' in signals and slots (or any other 'composed' type as e.g. unsigned int)
-
@Christian-Ehrlicher which vaule i can use in signal and slots?
-
@a_coder said in unresolved external symbol "public: static struct QMetaObject const staticMetaObject":
which vaule i can use in signal and slots?
How should I know which value you send through signals and slot. If you want which datatype then, as I already said, anything which consists of only one word to not confuse the moc compiler.
-
@Christian-Ehrlicher i want to synchronized my countdown from two windows so i send the signal with the time remain in there.however, i don't think that will make the code error
-
@JonB now i removed long long in signal and it will get that in Timer class but i still got some errors
Build started at 8:33 CH... 1>------ Build started: Project: project, Configuration: Debug x64 ------ 1>Reading Qt configuration (E:/Qt/6.7.0/msvc2019_64/bin/qmake) 1>uic mainw.ui 1>uic workspace.ui 1>moc control.h 1>moc mainw.h 1>moc workspace.h 1>main.cpp 1>mainw.cpp 1>workspace.cpp 1>moc_control.cpp 1>moc_mainw.cpp 1>G:\project\project\control.h(77,7): error C2143: syntax error: missing ';' before '*' 1>(compiling source file 'x64/Debug/moc/moc_mainw.cpp') 1>G:\project\project\control.h(77,7): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 1>(compiling source file 'x64/Debug/moc/moc_mainw.cpp') 1>G:\project\project\control.h(77,14): error C2238: unexpected token(s) preceding ';' 1>(compiling source file 'x64/Debug/moc/moc_mainw.cpp') 1>G:\project\project\control.h(51,15): error C2061: syntax error: identifier 'Mainw' 1>(compiling source file 'x64/Debug/moc/moc_mainw.cpp') 1>G:\project\project\control.h(51,27): error C2612: trailing ')' illegal in base/member initializer list 1>(compiling source file 'x64/Debug/moc/moc_mainw.cpp') 1>G:\project\project\mainw.h(12,2): warning C4081: expected ')'; found 'string' 1>(compiling source file 'x64/Debug/moc/moc_mainw.cpp') 1>G:\project\project\x64\Debug\moc\moc_mainw.cpp(32,1): warning C4081: expected ')'; found 'string' 1>G:\project\project\x64\Debug\moc\moc_mainw.cpp(159,1): error C1004: unexpected end-of-file found 1>Done building project "project.vcxproj" -- FAILED. ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== ========== Build completed at 8:33 CH and took 11,009 seconds ==========
-
#ifndef CONTROLER_H #define CONTROLER_H #include <qobject.h> #include <qtimer.h> #include <qobject.h> #include "mainw.h" #include "workspace.h" class Timer :public QObject { Q_OBJECT public: Timer(long long ×etup, QObject* parent = nullptr) :QObject(parent) ,counter(new QTimer) { timereaining = ×etup; connect(counter, &QTimer::timeout, this, &Timer::sendupdate); } long long timeleft() { return *timereaining; } void start() { counter->setInterval(1000); counter->start(); } signals: void requestupdated(); void timeout(); private slots: void sendupdate() { if (*timereaining <= 0) { emit timeout(); } else { (*timereaining)--; emit requestupdated(); } } private: long long* timereaining; QTimer* counter; }; class control :public QObject { Q_OBJECT public: control(Timer* time, QObject* parent = nullptr): QObject(parent) ,timer(time) , workspace(new Workspace(timer)) , mainw(new Mainw(timer)) { /*mainw = new Mainw(timer); workspace = new Workspace(timer);*/ } ~control() { } void start() { connect(mainw, &Mainw::change_gui, this, &control::changeto_workspace_slot); connect(workspace, &Workspace::change_gui, this, &control::changeto_mainw_slot); mainw->start(); } //signals: //void changeto_mainw(); //void changeto_workspace(); private slots: void changeto_mainw_slot() { mainw->start(); workspace->close(); } void changeto_workspace_slot() { workspace->start(); mainw->close(); } private: Timer* timer; Mainw* mainw; //line 77 Workspace* workspace; }; #endif // CONTROLER_H
sorry idk how to mark that
-
@jsulm i detached it before and these are my files
mainw.h#ifndef MAINW_H #define MAINW_H #include <qmainwindow.h> #include "ui_mainw.h" #include "control.h" class Timer; class control; class Mainw : public QMainWindow { Q_OBJECT public: void start(); Mainw(Timer* time, QWidget* parent = nullptr); ~Mainw(); signals: void change_gui(); private: Ui::Main* ui; Timer* timer; private slots: void updatetime(); void toworkspace() { ui->pushButton->setDisabled(true); emit change_gui(); this->close(); } }; #endif // !MAINW_H
workspace.h
#ifndef WORKSPACE_H #define WORKSPACE_H #include <qprocess.h> #include <qmainwindow.h> #include "ui_workspace.h" #include "control.h" class Timer; class Workspace : public QWidget { Q_OBJECT public: Workspace(Timer* time, QWidget* parent = nullptr); ~Workspace(); void start(); signals: void change_gui(); private: //store all processes the ui run in a vector std::vector<QProcess*> processes; Ui::workspace* ui; Timer* timer; private slots: void updatetime(); void goback(); }; #endif // WORKSPACE_H
-
@jsulm said in unresolved external symbol "public: static struct QMetaObject const staticMetaObject":
more than one QObject based class in one header file
I don't want to derail this thread, but spoke to @Chris-Kawa a while ago and we both agree we have done this for years with no problems. Maybe we just don't do something "unusual/naughty/complicated".