error LNK2001: unresolved external symbol "public: static struct QMetaObject .. from lib template
-
Hi,
I would like to create a custom class from the great lib QtAV, in a Qt lib template.
When I compile my class directly from my app, it works well.
But if I create my custom class in a custom qt lib ( (myStream.lib), I have the error : error LNK2001: unresolved external symbol "public: static struct QMetaObject... when I call it during compilation of my app :my custom class is InputStreamPreview :
#include <QtAVWidgets/VideoPreviewWidget.h> class InputStreamPreview : public QtAV::VideoPreviewWidget { Q_OBJECT ...
the complete error messages is :
myStream.lib(moc_inputstreampreview.obj) : error LNK2001: unresolved symbol "public: static struct QMetaObject const QtAV::VideoPreviewWidget::staticMetaObject" (?staticMetaObject@VideoPreviewWidget@QtAV@@2UQMetaObject@@B)
I compile on VS2017 with Qt5.12 and QtAV1.12.0
Have you got an idea to solve the problem ?
Thanks. -
Hi and welcome to devnet,
Can you show your .pro file ?
-
Hi,
I would like to create a custom class from the great lib QtAV, in a Qt lib template.
When I compile my class directly from my app, it works well.
But if I create my custom class in a custom qt lib ( (myStream.lib), I have the error : error LNK2001: unresolved external symbol "public: static struct QMetaObject... when I call it during compilation of my app :my custom class is InputStreamPreview :
#include <QtAVWidgets/VideoPreviewWidget.h> class InputStreamPreview : public QtAV::VideoPreviewWidget { Q_OBJECT ...
the complete error messages is :
myStream.lib(moc_inputstreampreview.obj) : error LNK2001: unresolved symbol "public: static struct QMetaObject const QtAV::VideoPreviewWidget::staticMetaObject" (?staticMetaObject@VideoPreviewWidget@QtAV@@2UQMetaObject@@B)
I compile on VS2017 with Qt5.12 and QtAV1.12.0
Have you got an idea to solve the problem ?
Thanks.Three possibilities (in order of commonality):
- You haven't specified the library for linking, or it is not found. See @SGaist's request and provide the project file so we can inspect it.
- You and/or the library you're using is missing
__declspec(dllimport)
and/or__declspec(dllexport)
for some reason. Make sure when compiling the library that the relevant macros are defined and list the symbols from the dll so you can make sure they're exported. - You're mixing incompatible compilers - the library is compiled with something e.g. mingw while you're trying to link with msvc (also versions matter).
-
myStream lib
TARGET = myStream DESTDIR = D:/Dev/Programme/myLibs/myStream/lib/ms TEMPLATE = lib CONFIG += static thread QT += widgets avwidgets UI_HEADERS_DIR = build/ms/h OBJECTS_DIR = build/ms/o RCC_DIR = build/ms/qrc MOC_DIR = build/ms/moc INCLUDEPATH = D:/Dev/Programme/3rdparty/ms/include LIBS = -LD:/Dev/Programme/3rdparty/ms/lib -lavformat HEADERS += \ ../../src/inputstream.h \ ../../src/dateparser.h \ ../../src/inputstreammanager.h \ ../../src/inputstreamcontrol.h \ ../../src/inputscenecontrol.h \ ../../src/inputstreamvideo.h \ ../../src/inputstreampegasus.h \ ../../src/inputstreaminfo.h \ ../../src/inputstreamimages.h \ ../../src/stabilizer.h \ ../../src/inputstreampreviewslider.h \ ../../src/inputstreampreview.h SOURCES += \ ../../src/inputstream.cpp \ ../../src/dateparser.cpp \ ../../src/inputstreammanager.cpp \ ../../src/inputstreamcontrol.cpp \ ../../src/inputscenecontrol.cpp \ ../../src/inputstreamvideo.cpp \ ../../src/inputstreampegasus.cpp \ ../../src/inputstreamimages.cpp \ ../../src/stabilizer.cpp \ ../../src/inputstreampreviewslider.cpp \ ../../src/inputstreampreview.cpp
Application .pro
QT += network widgets printsupport sql concurrent xml multimedia QT += webenginewidgets QT += avwidgets TEMPLATE = app DESTDIR = D:/Dev/Programme/AppTest/bin/ms VERSION = 4.0 TARGET = AppTest DEFINES += TARGET_NAME=\\\"$$TARGET\\\" RC_FILE = ../../qrc/app.rc UI_HEADERS_DIR = h OBJECTS_DIR = o RCC_DIR = qrc MOC_DIR = moc INCLUDEPATH = D:/Dev/Programme/3rdparty/ms/include LIBS = -LD:/Dev/Programme/3rdparty/ms/lib \ -lmyGUI \ -lmyCharts \ -lmyObject \ -lmyStyleSheet \ -lmyScene \ -lmyStream -lswscale -lavformat -lavcodec -lavutil -lswresample -lws2_32 -lsecur32 \ -lmyGraphics \ -lmyCore \ -lopencv_core400 \ -lopencv_flann400 -ltbb -lzlib \ -lgandalf \ -lexiv2 -llibexpat \ -llibcrypto \ -lSMTPEmail \ -lproj_5_2 \ -lquazip RESOURCES += \ ../../qrc/resource.qrc SOURCES += \ ../../src/main.cpp \ ../../src/core/interface.cpp \ ../../src/core/core.cpp \ ../../src/gui/maingui.cpp \ ../../src/view/playerwidget.cpp \ ../../src/view/sectionview.cpp \ ../../src/view/inputstreampreview.cpp HEADERS += \ ../../src/core/interface.h \ ../../src/core/core.h \ ../../src/gui/maingui.h \ ../../src/view/playerwidget.h \ ../../src/view/sectionview.h \ ../../src/view/frame.h \ ../../src/view/inputstreampreview.h
-
Three possibilities (in order of commonality):
- You haven't specified the library for linking, or it is not found. See @SGaist's request and provide the project file so we can inspect it.
- You and/or the library you're using is missing
__declspec(dllimport)
and/or__declspec(dllexport)
for some reason. Make sure when compiling the library that the relevant macros are defined and list the symbols from the dll so you can make sure they're exported. - You're mixing incompatible compilers - the library is compiled with something e.g. mingw while you're trying to link with msvc (also versions matter).
- QtAV is imported in Qt config, so I think all is good for that (just add QT += avwidgets)
- I have thinking about this problem but I don't know how to see if it's OK are not.
- I've checked, and it's ok about that.
-
- QtAV is imported in Qt config, so I think all is good for that (just add QT += avwidgets)
- I have thinking about this problem but I don't know how to see if it's OK are not.
- I've checked, and it's ok about that.
@OPit said in error LNK2001: unresolved external symbol "public: static struct QMetaObject .. from lib template:
- QtAV is imported in Qt config, so I think all is good for that (just add QT += avwidgets)
Did you build that module yourself?
- I have thinking about this problem but I don't know how to see if it's OK are not.
Firstly, use dependency walker to find out what the module links against, from there you could also see what kinds of symbols are exported. Then you can do the same for your library and see if everything matches.
- I've checked, and it's ok about that.
How did you check? Where did you get the qtav module from, or did you compiled it yourself?
-
@OPit said in error LNK2001: unresolved external symbol "public: static struct QMetaObject .. from lib template:
- QtAV is imported in Qt config, so I think all is good for that (just add QT += avwidgets)
Did you build that module yourself?
- I have thinking about this problem but I don't know how to see if it's OK are not.
Firstly, use dependency walker to find out what the module links against, from there you could also see what kinds of symbols are exported. Then you can do the same for your library and see if everything matches.
- I've checked, and it's ok about that.
How did you check? Where did you get the qtav module from, or did you compiled it yourself?
@kshegunov Yes, I've built myself the QtAv lib (because the last precompile binaries not use the last version of QtAv).
I've checked which compiler was used during compilation, and it was the same for each module.NB : if I link the moc_inputstreampreview.obj file directly in my app, it works ?!?
LIBS += path/of/file/moc_inputstreampreview.obj
-
In your build output, can you see whether the QtAV libraries are currently getting linked to your application ?
-
Hi,
I'm using QtCreator with visual studio compiler and I don't have a lot of informations during linking :link /NOLOGO /DYNAMICBASE /NXCOMPAT /INCREMENTAL:NO /SUBSYSTEM:WINDOWS "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" /VERSION:4.0 /MANIFEST:embed /OUT:..\..\bin\ms\L2R_Video.exe @c:\Temp\L2R_Video.exe.4652.31672.jom myStream.lib(moc_inputstreampreview.obj) : error LNK2001: symbole externe non résolu "public: static struct QMetaObject const QtAV::VideoPreviewWidget::staticMetaObject" (?staticMetaObject@VideoPreviewWidget@QtAV@@2UQMetaObject@@B) ..\..\bin\ms\L2R_Video.exe : fatal error LNK1120: 1 externes non résolus
But in my Makefile.Release file, the QtAv libs are well written :
LIBS = /LIBPATH:D:\Dev\Programme\3rdparty\ms\lib D:\Dev\Programme\3rdparty\ms\lib\myStream.lib D:\Dev\Programme\3rdparty\ms\lib\swscale.lib D:\Dev\Programme\3rdparty\ms\lib\avformat.lib D:\Dev\Programme\3rdparty\ms\lib\avcodec.lib D:\Dev\Programme\3rdparty\ms\lib\avutil.lib D:\Dev\Programme\3rdparty\ms\lib\swresample.lib secur32.lib D:\Dev\Programme\3rdparty\ms\lib\myGraphics.lib ws2_32.lib shell32.lib advapi32.lib gdi32.lib User32.lib /LIBPATH:D:\Dev\Environnement\ms\Qt\5.12.0\msvc2017_64\lib D:\Dev\Environnement\ms\Qt\5.12.0\msvc2017_64\lib\Qt5WebEngineWidgets.lib D:\Dev\Environnement\ms\Qt\5.12.0\msvc2017_64\lib\Qt5PrintSupport.lib D:\Dev\Environnement\ms\Qt\5.12.0\msvc2017_64\lib\Qt5AVWidgets.lib D:\Dev\Environnement\ms\Qt\5.12.0\msvc2017_64\lib\Qt5OpenGL.lib D:\Dev\Environnement\ms\Qt\5.12.0\msvc2017_64\lib\Qt5Widgets.lib D:\Dev\Environnement\ms\Qt\5.12.0\msvc2017_64\lib\Qt5Multimedia.lib D:\Dev\Environnement\ms\Qt\5.12.0\msvc2017_64\lib\Qt5WebEngineCore.lib D:\Dev\Environnement\ms\Qt\5.12.0\msvc2017_64\lib\Qt5Quick.lib D:\Dev\Environnement\ms\Qt\5.12.0\msvc2017_64\lib\Qt5AV.lib ...
-
Might be a silly question but are linking to libraries of the same type ? Meaning matching debug/release builds.
-
@SGaist said in error LNK2001: unresolved external symbol "public: static struct QMetaObject .. from lib template:
silly
Sadly it's not the problem ...
-
If I open QtAvWidget1.dll, I found the function :
?metaObject@VideoPreviewWidget@QtAV@@UEBAPEBUQMetaObject@@XZ
I can't read .lib file from dependency walker, how can I check these files ?
This:
@OPit said in error LNK2001: unresolved external symbol "public: static struct QMetaObject .. from lib template:
?metaObject@VideoPreviewWidget@QtAV@@UEBAPEBUQMetaObject@@XZ
Is very different from this:
?staticMetaObject@VideoPreviewWidget@QtAV@@2UQMetaObject@@B
The former is a method, the latter is a (global) variable. Please try again. Could you also provide the content of the
moc
file in question (the one that fixes the issue if linked with)? -
@aha_1980 yes, the same architecture
@kshegunov this is a link to download the file (I can't upload from the forum) :
https://we.tl/t-bhEPIToZV2Thanks.
-
-
@aha_1980 yes, the same architecture
@kshegunov this is a link to download the file (I can't upload from the forum) :
https://we.tl/t-bhEPIToZV2Thanks.
@OPit said in error LNK2001: unresolved external symbol "public: static struct QMetaObject .. from lib template:
this is a link to download the file (I can't upload from the forum)
I'm sorry I wasn't clear. I meant the generated
moc_XXX.cpp
file. I have no tools to inspect the object file even if I wanted to because I work exclusively on Linux.@hskoglund said in error LNK2001: unresolved external symbol "public: static struct QMetaObject .. from lib template:
Hi, perhaps it's a namespace problem, you could try changing to a using statement in your InputStreamPreview.h
A decent idea, but I don't think that's it.
moc
, while not too smart, does recognize namespaces and generates code accordingly. I do use them and everything links fine. -
@kshegunov oh sorry, this is the cpp file.