error LNK2001: unresolved external symbol "public: static struct QMetaObject .. from lib template



  • This post is deleted!


  • 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
    


  • @kshegunov

    1. QtAV is imported in Qt config, so I think all is good for that (just add QT += avwidgets)
    2. I have thinking about this problem but I don't know how to see if it's OK are not.
    3. I've checked, and it's ok about that.

  • Qt Champions 2017

    @OPit said in error LNK2001: unresolved external symbol "public: static struct QMetaObject .. from lib template:

    1. QtAV is imported in Qt config, so I think all is good for that (just add QT += avwidgets)

    Did you build that module yourself?

    1. 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.

    1. 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
    


  • 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 ?


  • Lifetime Qt Champion

    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 
    ...
    

  • Lifetime Qt Champion

    Might be a silly question but are linking to libraries of the same type ? Meaning matching debug/release builds.




  • Qt Champions 2018

    @OPit And both have the same architecture, i.e. 32 vs. 64 bit?


  • Qt Champions 2017

    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-bhEPIToZV2

    Thanks.



  • Hi, perhaps it's a namespace problem, you could try changing to a using statement in your InputStreamPreview.h:

    #include <QtAVWidgets/VideoPreviewWidget.h>
    
    using namespace QtAV;
    
    class InputStreamPreview : public VideoPreviewWidget
    {
    Q_OBJECT
    ...
    

  • Qt Champions 2017

    @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.

    https://we.tl/t-NXhNCGkSmc



  • Hi, do you have a moc_VideoPreviewWidget.cpp that's compiled using Qt 5.12? (The one in the link is built with Qt 5.9.1)



  • @hskoglund yes of course : https://we.tl/t-Uhhsre7Vzm

    the problem is the same with version 5.9.1 or 5.12 (and also VS2017 or VS2015)



  • Hi, if you look in the .pro files above for your application and myStream.lib, both .pro files have a inputstreampreview.cpp and a inputstreampreview.h included. They are not located in the same directory (one pair is in ../../src/ and the other pair is in ../../src/view/) but if they have the same contents then maybe the linker gets confused when you build your app (together with your myStream.lib).

    If they do not have the same contents (i.e. just a stroke of bad luck with the naming of your files) then rename one of the pairs. Otherwise, you could try building your app again but with only of the pairs, for example commenting out ../../src/view/inputstreampreview.cpp from the SOURCES section in your Application.pro file.



  • @hskoglund said in error LNK2001: unresolved external symbol "public: static struct QMetaObject .. from lib template:

    inputstreampreview.cpp

    thanks for your answer, but I don't understand well what you want to say.
    inputstreampreview.cpp/.h are only included in myStream.lib (in src folder).
    For my main app, I just include the .h with INCLUDEPATH keyword and link myStream lib with LIBS+= -lmyStream
    I don't know why and where you can see ../../src/view/ path ??



  • 0_1547215144787_Screenshot from 2019-01-11 14-53-12.png



  • @hskoglund oups it's a mistake, a drag and drop in my exemple app.pro. But even if I remove this entry, I have the same problem.



  • Even if you run qmake and rebuild AppTest.exe i.e. Application.pro?


  • Qt Champions 2017

    I'm pretty sure at this point that for whatever reason your static library didn't include the symbol in question. One way or another you need to find why that happened. It may be a bug with the library, or some misconfiguration.



  • Well, I rebuilt QtAV with a new installation of Qt, and it works ....
    So, even if I didn't understand the mistake, thanks a lot for your help !


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.