LNK2001: Unresolved external symbol when using qwt plot in Qt creator - c++

I am subclassing QwtPlot. I have the following error:
moc_myplot.obj:-1: error: LNK2001: unresolved external symbol "public: static struct QMetaObject const QwtPlot::staticMetaObject" (?staticMetaObject#QwtPlot##2UQMetaObject##B)
I have tried to the following things: run qmake, rebuild, clean, delete debug folder, recompile qwt library. That doesn't help. Here is minimal code:
myplot.h:
#ifndef MYPLOT_H
#define MYPLOT_H
#include <QObject>
#include <qwt_plot.h>
class MyPlot : public QwtPlot
{
Q_OBJECT
public:
MyPlot();
};
#endif // MYPLOT_H
myplot.cpp:
#include "myplot.h"
MyPlot::MyPlot()
{
}
Here is .pro file:
#-------------------------------------------------
#
# Project created by QtCreator 2015-06-22T19:33:24
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = MyPlot
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp \
myplot.cpp
HEADERS += mainwindow.h \
myplot.h
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../../../../qwt-6.1.2/lib/ -lqwt
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../../../../qwt-6.1.2/lib/ -lqwtd
else:unix: LIBS += -L$$PWD/../../../../../qwt-6.1.2/lib/ -lqwt
INCLUDEPATH += $$PWD/../../../../../qwt-6.1.2/include
DEPENDPATH += $$PWD/../../../../../qwt-6.1.2/include
I am using Qt Creator 3.4.1 Based on Qt 5.4.2 (MSVC 2013, 32 bit). Kit: Desktop Qt 5.4.2 MSVC2013 64bit. Compiler: Microsof Visual C++ Compiler 12.0(amd64). If I comment Q_OBJECT macro in myplot.h everything is ok. I can use qwt_plot without subclassing, so that this->setCentralWidget(new QwtPlot()); line in mainwindow.cpp is ok.

It seems this is an old issue that was present in at least version 4.6.
The workaround is basically a preprocessor define of QWT_DLL from the "very lowest library that calls QWT".

Related

HDF5 C++ Qt conflicting declaration

Situation: I need to read a .hdf5 file and show the data graphically in an interface created with Qt.
What i did: I created a new project doing nothing but adding the hdf5.lib as an external library to the hdf5_test.pro using the the qt wizard for doing that and #include <hdf5.h> in the mainwindow.h
Problem:
When trying to run the code, i get this Error: conflicting declaration 'typedef long long ssize_t'
Using:
C++
Qt 5.10.1
MinGW 5.3.0 32bit for C++
HDF5 1.10.2
My Code:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <hdf5.h>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = hdf5_test
TEMPLATE = app
# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp \
mainwindow.cpp
HEADERS += \
mainwindow.h
FORMS += \
mainwindow.ui
win32:CONFIG(release, debug|release): LIBS += -L'C:/Program Files/HDF_Group/HDF5/1.10.2/lib/' -lhdf5
else:win32:CONFIG(debug, debug|release): LIBS += -L'C:/Program Files/HDF_Group/HDF5/1.10.2/lib/' -lhdf5d
else:unix: LIBS += -L'C:/Program Files/HDF_Group/HDF5/1.10.2/lib/' -lhdf5
INCLUDEPATH += 'C:/Program Files/HDF_Group/HDF5/1.10.2/include'
DEPENDPATH += 'C:/Program Files/HDF_Group/HDF5/1.10.2/include'
This might be a simillar problem, but there are no answers.
This is a hack, but the hdf5.h checks for H5_SIZEOF_SSIZE_T to be equal to zero. So using a
#define H5_SIZEOF_SSIZE_T H5_SIZEOF_LONG_LONG
before including hdf5.h could help by not redefining the type.

Qt Creator : Adding an external library (header file not found)

This is my external library location in my Qt project (named contr):
This is my makefile :
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = contr
TEMPLATE = app
INCLUDEPATH += 3rdparty/libs/libusb
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
LIBS += -L"3rdparty/libs/libusb" -llibusb
In a file, I have this include :
#include <libusb.h>
When I compile, I get the following error :
mainwindow.cpp:3: erreur : C1083: Cannot open include file: 'libusb.h': No such file or directory
EDIT :
I work on Windows

Can't get enumeration on library (undefined reference staticMetaObject)

I have an application which uses a Qt library (shared library). On my library, I have a class with several enumerations which I want use on main application.
I build my library project without problem but I when I build main application project, I have the error :
moc_myapp.cpp:-1: erreur : undefined reference to `MyClass::staticMetaObject'
I didn't find information about this error.
This is my Biblio .pro
QT -= gui
QT += quick multimedia network
TARGET = MyBiblio
TEMPLATE = lib
DEFINES += MYBIBLIO_LIBRARY
SOURCES += myBiblio.cpp
HEADERS += myBiblio.h\
myBiblio_global.h \
myClass.h
This myClass.h :
#ifndef MYCLASS_H
#define MYCLASS_H
#include <QObject>
class MyClass : public QObject
{
Q_OBJECT
public:
enum MyEnumeration {Enum1, Enum2, Enum3};
Q_ENUMS(MyEnumeration)
};
#endif // MYCLASS_H
and myApp .pro :
TEMPLATE = app
QT += qml quick multimedia network widgets sql xml
SOURCES += main.cpp \
myapp.cpp
HEADERS += \
myapp.h
RESOURCES += qml.qrc
# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =
# Default rules for deployment.
include(deployment.pri)
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/pathTo/build-MyBiblio_Qt_5_2_1/release/ -lMyBiblio
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/pathTo/build-MyBiblio_Qt_5_2_1/debug/ -lMyBiblio
INCLUDEPATH += $$PWD/pathTo/MyBiblio
DEPENDPATH += $$PWD/pathTo/MyBiblio
On myapp.cpp, I use enumeration define of the library :
MyClass::MyEnumeration
and i include "myclass.h"
i use Qt 5.2 under Windows.
Thank you for your help
When creating a shared library that you would like to link against, then you need to ensure that the symbols that are going to be used outside the library are properly exported when the library is created. And subsequently imported when you are linking against the library. This can be done using Q_DECL_EXPORT and Q_DECL_IMPORT
You already have the following define in your lib pro:
DEFINES += MYBIBLIO_LIBRARY
Modify your myClass.h as follows:
#if defined MYBIBLIO_LIBRARY
#define MYBIBLIO_LIBRARY_DLLSPEC Q_DECL_EXPORT
#else
#define MYBIBLIO_LIBRARY_DLLSPEC Q_DECL_IMPORT
#endif
class MYBIBLIO_LIBRARY_DLLSPEC MyClass : public QObject
{
Please, read How to create a library with Qt and use it in an application for more information.

How to include Winpcap to Qt creator?

I tried to use different combination in .pro file but always get these errors :
error: C2065: 'PCAP_SRC_IF_STRING' : undeclared identifier
error: C3861: 'pcap_findalldevs_ex': identifier not found
Here is my .pro file :
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = snif_del
TEMPLATE = app
LIBS += WS2_32.lib
INCLUDEPATH += D:/libs/WpdPack/Include
LIBS += -L D:/libs/WpdPack/Lib/ -lwpcap -lpacket
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
Also i added #include "pcap.h" to my code.
Your .pro file should look like this:
INCLUDEPATH += D:/libs/WpdPack/Include
LIBS += "-LD:/libs/WpdPack/Lib" -lwpcap -lws2_32
If your program uses Win32 specific functions of WinPcap, add
DEFINES += WPCAP
If your program uses the remote capture capabilities of WinPcap, add
DEFINES += HAVE_REMOTE
In your code you should add
#include <winsock2.h>
#include <pcap.h>

How to use FTD2xx library on QtCreator (with MSVC2012 compiler)

I have trouble in making an application which communicates FTDI devices via D2xx driver.There is some example project for Visual Studio in ftdi's website. But there isn't for QtCreator. I chose QtCreator as c++ IDE because my application needs Qt framework.
I put ftd2xx.h and ftd2xx.lib in the Qt project directory.
(ftd2xx.lib is static library, which were originally located in [download-folder]\CDM v2.08.30 for Windows 8.1\Static\i386)
When sample source code was compiled, I got following error message.
Error message when I use .pro file(1).
LNK1104: cannot open file 'ftd2xx.lib'
Error message when I use .pro file(2).
error: Assignment needs exactly one word on the left hand side.
How should I correct Qt project setup in order to utilizes ftd2xx library?
My source code and .pro file is here.
[main.cpp]
#include <QCoreApplication>
#include <windows.h>
#include "ftd2xx.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
FT_HANDLE ftHandle;
FT_STATUS ftStatus;
ftStatus = FT_Open(0,&ftHandle);
return a.exec();
}
[.pro file if the checkbox is enabled] ---(1)
#-------------------------------------------------
#
# Project created by QtCreator 2014-02-11T18:51:08
#
#-------------------------------------------------
QT += core
QT -= gui
TARGET = D2XXtest
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
HEADERS += ftd2xx.h
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/ -lftd2xx
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/ -lftd2xxd
INCLUDEPATH += $$PWD/
DEPENDPATH += $$PWD/
win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/libftd2xx.a
else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/libftd2xxd.a
else:win32:!win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/ftd2xx.lib
else:win32:!win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/ftd2xxd.lib
[.pro file if the checkbox is NOT enabled] ---(2)
#-------------------------------------------------
#
# Project created by QtCreator 2014-02-11T18:51:08
#
#-------------------------------------------------
QT += core
QT -= gui
TARGET = D2XXtest
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
HEADERS += ftd2xx.h
win32: LIBS += -L$$PWD/ -lftd2xx
INCLUDEPATH += $$PWD/
DEPENDPATH += $$PWD/
win32:!win32-g++ PRE_TARGETDEPS += $$PWD/ftd2xx.lib
else:win32-g++: PRE_TARGETDEPS += $$PWD/libftd2xx.a
Any help would be appreciated. Thanks in advance.
[Note]
OS: Windows 8.1
IDE: Qt Creator 3.0.0
Compiler: MSVC2012(32bit)
Target device: ft232hl
[Additional Note]
The configuration of "Add Library" is following.
If I enable the checkbox "Add "d" suffix for debug version, then I got error message about LNK1104. Otherwise, I got different error message.
My hunch is that you've made a typo in your error message, and the real error message reads as follows:
LNK1104: cannot open file 'ftd2xxd.lib'
See that d there? It doesn't belong, there's no ftd2xxd.lib. You need to change any references to ftd2xxd.lib back to ftd2xx.lib, re-run qmake, and you should be all set. Otherwise your .pro file seems correct.
After your edit, you gave a .pro file with the "checkbox enabled". That's certainly not true, since the contents you show imply that the checkbox is disabled, not enabled.
Anyway, we don't care what the dialog box settings are. Just show the actual .pro file that you really use, because so far I don't know which one you do use, and I don't know if you've re-run qmake after the .pro file was changed.
Are you sure that the ftd2xx.lib file is actually in the same folder where the .pro file is?