Название: Создание динамической библиотеки
Отправлено: nevero от Июль 09, 2012, 12:54
Здравствуйте. Помогите с вопросом, пожалуйста. Я пробую создать dll библиотеку. Использую Qt Visual Studio Add-in. Библиотеку Qt 4.8.2 собрал сам компилятором msvc2010. Собственно делаю так: 1) Создаю проект библиотеки в Qt Visual Studio Add-in. 2) Создаётся автоматически файл экспорта: #ifndef TEST_QT_DLL_GLOBAL_H #define TEST_QT_DLL_GLOBAL_H
#include <QtCore/qglobal.h>
#ifdef TEST_QT_DLL_LIB # define TEST_QT_DLL_EXPORT Q_DECL_EXPORT #else # define TEST_QT_DLL_EXPORT Q_DECL_IMPORT #endif
#endif // TEST_QT_DLL_GLOBAL_H 2) Код самого класса: #ifndef TEST_QT_DLL_H #define TEST_QT_DLL_H
#include <QtGui\qtreeview.h> #include "test_qt_dll_global.h"
class TEST_QT_DLL_EXPORT Test_Qt_DLL: public QTreeView { Q_OBJECT public: Test_Qt_DLL(QWidget* pwgt = 0); private:
};
#endif // TEST_QT_DLL_H #include "test_qt_dll.h"
Test_Qt_DLL::Test_Qt_DLL(QWidget* pwgt) : QTreeView(pwgt) { } Но при компиляции выдаёт кучу ошибок линковки: 1>------ Перестроение всех файлов начато: проект: Test_Qt_DLL, Конфигурация: Debug Win32 ------ 1> Moc'ing test_qt_dll.h... 1> moc_test_qt_dll.cpp 1> test_qt_dll.cpp 1> Создание кода... 1> Создается библиотека D:\Visual Studio\Test_Qt_DLL\Win32\Debug\Test_Qt_DLL.lib и объект D:\Visual Studio\Test_Qt_DLL\Win32\Debug\Test_Qt_DLL.exp 1>moc_test_qt_dll.obj : error LNK2019: ссылка на неразрешенный внешний символ "__declspec(dllimport) public: virtual __thiscall QTreeView::~QTreeView(void)" (__imp_??1QTreeView@@UAE@XZ) в функции "public: virtual __thiscall Test_Qt_DLL::~Test_Qt_DLL(void)" (??1Test_Qt_DLL@@UAE@XZ) 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""__declspec(dllimport) public: virtual __thiscall QTreeView::~QTreeView(void)" (__imp_??1QTreeView@@UAE@XZ)" 1>moc_test_qt_dll.obj : error LNK2019: ссылка на неразрешенный внешний символ "__declspec(dllimport) public: virtual void * __thiscall QTreeView::qt_metacast(char const *)" (__imp_?qt_metacast@QTreeView@@UAEPAXPBD@Z) в функции "public: virtual void * __thiscall Test_Qt_DLL::qt_metacast(char const *)" (?qt_metacast@Test_Qt_DLL@@UAEPAXPBD@Z) 1>moc_test_qt_dll.obj : error LNK2019: ссылка на неразрешенный внешний символ "__declspec(dllimport) public: virtual int __thiscall QTreeView::qt_metacall(enum QMetaObject::Call,int,void * *)" (__imp_?qt_metacall@QTreeView@@UAEHW4Call@QMetaObject@@HPAPAX@Z) в функции "public: virtual int __thiscall Test_Qt_DLL::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Test_Qt_DLL@@UAEHW4Call@QMetaObject@@HPAPAX@Z) 1>moc_test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""__declspec(dllimport) public: static struct QMetaObject const QTreeView::staticMetaObject" (__imp_?staticMetaObject@QTreeView@@2UQMetaObject@@B)" 1>test_qt_dll.obj : error LNK2019: ссылка на неразрешенный внешний символ "__declspec(dllimport) public: __thiscall QTreeView::QTreeView(class QWidget *)" (__imp_??0QTreeView@@QAE@PAVQWidget@@@Z) в функции "public: __thiscall Test_Qt_DLL::Test_Qt_DLL(class QWidget *)" (??0Test_Qt_DLL@@QAE@PAVQWidget@@@Z) 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""protected: virtual bool __thiscall QAbstractItemView::event(class QEvent *)" (?event@QAbstractItemView@@MAE_NPAVQEvent@@@Z)" 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""protected: virtual void __thiscall QTreeView::timerEvent(class QTimerEvent *)" (?timerEvent@QTreeView@@MAEXPAVQTimerEvent@@@Z)" 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""public: virtual void __thiscall QWidget::setVisible(bool)" (?setVisible@QWidget@@UAEX_N@Z)" 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""public: virtual class QSize __thiscall QAbstractScrollArea::sizeHint(void)const " (?sizeHint@QAbstractScrollArea@@UBE?AVQSize@@XZ)" 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""public: virtual class QSize __thiscall QAbstractScrollArea::minimumSizeHint(void)const " (?minimumSizeHint@QAbstractScrollArea@@UBE?AVQSize@@XZ)" 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""public: virtual int __thiscall QWidget::heightForWidth(int)const " (?heightForWidth@QWidget@@UBEHH@Z)" 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""protected: virtual void __thiscall QTreeView::mousePressEvent(class QMouseEvent *)" (?mousePressEvent@QTreeView@@MAEXPAVQMouseEvent@@@Z)" 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""protected: virtual void __thiscall QTreeView::mouseReleaseEvent(class QMouseEvent *)" (?mouseReleaseEvent@QTreeView@@MAEXPAVQMouseEvent@@@Z)" 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""protected: virtual void __thiscall QTreeView::mouseDoubleClickEvent(class QMouseEvent *)" (?mouseDoubleClickEvent@QTreeView@@MAEXPAVQMouseEvent@@@Z)" 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""protected: virtual void __thiscall QTreeView::mouseMoveEvent(class QMouseEvent *)" (?mouseMoveEvent@QTreeView@@MAEXPAVQMouseEvent@@@Z)" 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""protected: virtual void __thiscall QAbstractScrollArea::wheelEvent(class QWheelEvent *)" (?wheelEvent@QAbstractScrollArea@@MAEXPAVQWheelEvent@@@Z)" 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""protected: virtual void __thiscall QTreeView::keyPressEvent(class QKeyEvent *)" (?keyPressEvent@QTreeView@@MAEXPAVQKeyEvent@@@Z)"
............
1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""protected: virtual void __thiscall QAbstractItemView::editorDestroyed(class QObject *)" (?editorDestroyed@QAbstractItemView@@MAEXPAVQObject@@@Z)" 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""protected: virtual class QModelIndex __thiscall QTreeView::moveCursor(enum QAbstractItemView::CursorAction,class QFlags<enum Qt::KeyboardModifier>)" (?moveCursor@QTreeView@@MAE?AVQModelIndex@@W4CursorAction@QAbstractItemView@@V?$QFlags@W4KeyboardModifier@Qt@@@@@Z)" 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""protected: virtual int __thiscall QTreeView::horizontalOffset(void)const " (?horizontalOffset@QTreeView@@MBEHXZ)" 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""protected: virtual int __thiscall QTreeView::verticalOffset(void)const " (?verticalOffset@QTreeView@@MBEHXZ)" 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""protected: virtual bool __thiscall QTreeView::isIndexHidden(class QModelIndex const &)const " (?isIndexHidden@QTreeView@@MBE_NABVQModelIndex@@@Z)" 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""protected: virtual void __thiscall QTreeView::setSelection(class QRect const &,class QFlags<enum QItemSelectionModel::SelectionFlag>)" (?setSelection@QTreeView@@MAEXABVQRect@@V?$QFlags@W4SelectionFlag@QItemSelectionModel@@@@@Z)" 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""protected: virtual class QRegion __thiscall QTreeView::visualRegionForSelection(class QItemSelection const &)const " (?visualRegionForSelection@QTreeView@@MBE?AVQRegion@@ABVQItemSelection@@@Z)" 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""protected: virtual class QList<class QModelIndex> __thiscall QTreeView::selectedIndexes(void)const " (?selectedIndexes@QTreeView@@MBE?AV?$QList@VQModelIndex@@@@XZ)" 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""protected: virtual class QFlags<enum QItemSelectionModel::SelectionFlag> __thiscall QAbstractItemView::selectionCommand(class QModelIndex const &,class QEvent const *)const " (?selectionCommand@QAbstractItemView@@MBE?AV?$QFlags@W4SelectionFlag@QItemSelectionModel@@@@ABVQModelIndex@@PBVQEvent@@@Z)" 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""protected: virtual void __thiscall QAbstractItemView::startDrag(class QFlags<enum Qt::DropAction>)" (?startDrag@QAbstractItemView@@MAEXV?$QFlags@W4DropAction@Qt@@@@@Z)" 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""protected: virtual class QStyleOptionViewItem __thiscall QAbstractItemView::viewOptions(void)const " (?viewOptions@QAbstractItemView@@MBE?AVQStyleOptionViewItem@@XZ)" 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""protected: virtual void __thiscall QTreeView::drawRow(class QPainter *,class QStyleOptionViewItem const &,class QModelIndex const &)const " (?drawRow@QTreeView@@MBEXPAVQPainter@@ABVQStyleOptionViewItem@@ABVQModelIndex@@@Z)" 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""protected: virtual void __thiscall QTreeView::drawBranches(class QPainter *,class QRect const &,class QModelIndex const &)const " (?drawBranches@QTreeView@@MBEXPAVQPainter@@ABVQRect@@ABVQModelIndex@@@Z)" 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""public: virtual int __thiscall QWidget::devType(void)const " (?devType@QWidget@@UBEHXZ)" 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""public: virtual class QPaintEngine * __thiscall QWidget::paintEngine(void)const " (?paintEngine@QWidget@@UBEPAVQPaintEngine@@XZ)" 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""public: virtual struct HDC__ * __thiscall QWidget::getDC(void)const " (?getDC@QWidget@@UBEPAUHDC__@@XZ)" 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""public: virtual void __thiscall QWidget::releaseDC(struct HDC__ *)const " (?releaseDC@QWidget@@UBEXPAUHDC__@@@Z)" 1>test_qt_dll.obj : error LNK2001: неразрешенный внешний символ ""protected: virtual int __thiscall QWidget::metric(enum QPaintDevice::PaintDeviceMetric)const " (?metric@QWidget@@MBEHW4PaintDeviceMetric@QPaintDevice@@@Z)" 1>D:\Visual Studio\Test_Qt_DLL\Win32\Debug\\Test_Qt_DLL.dll : fatal error LNK1120: 93 неразрешенных внешних элементов ========== Перестроение всех: успешно: 0, с ошибками: 1, пропущено: 0 ========== (Я пропустил часть вывода, так как размер сообщения превышал допустимый максимум для форума) С чем это связано и что я делаю не так?
Название: Re: Создание динамической библиотеки
Отправлено: mutineer от Июль 09, 2012, 12:59
Qt-либы в проект подключал?
Название: Re: Создание динамической библиотеки
Отправлено: nevero от Июль 09, 2012, 13:01
Я создаю проект библиотеки, там прописаны автоматически пути.
Название: Re: Создание динамической библиотеки
Отправлено: CJ1 от Июль 09, 2012, 14:24
Здесь явно нужны либы
Название: Re: Создание динамической библиотеки
Отправлено: mutineer от Июль 09, 2012, 14:26
Линкеру твои автоматические пути чем-то не нравятся или он не хочет их использовать
Название: Re: Создание динамической библиотеки
Отправлено: nevero от Июль 09, 2012, 14:39
Тогда что конкретно должно быть прописано? Может статьи уже есть (поиск по не дал нормального результата) ?
Название: Re: Создание динамической библиотеки
Отправлено: CJ1 от Июль 09, 2012, 14:43
Может стоит попробовать напрямую указать либы, #pragma comment(lib,"QtCore4.lib")
И так все необходимые
Название: Re: Создание динамической библиотеки
Отправлено: nevero от Июль 09, 2012, 15:00
Действительно, QtGui4.lib не хватало. Значит надо вручную контролировать....
Спасибо за помощь!
Название: Re: Создание динамической библиотеки
Отправлено: CJ1 от Июль 09, 2012, 15:06
Да, помойму если в файле pro указать LIBS += QtGui4.lib будет тот же эффект
Название: Re: Создание динамической библиотеки
Отправлено: Alex Custov от Июль 09, 2012, 15:48
очевидно, что проект не линкуется с QtGui
Название: Re: Создание динамической библиотеки
Отправлено: nevero от Июль 09, 2012, 16:27
У меня ещё такой глупый вопрос: Вот создал файл экспорта: #ifndef TEST_QT_DLL_GLOBAL_H #define TEST_QT_DLL_GLOBAL_H
#include <QtCore/qglobal.h>
#ifdef TEST_QT_DLL_LIB # define TEST_QT_DLL_EXPORT Q_DECL_EXPORT #else # define TEST_QT_DLL_EXPORT Q_DECL_IMPORT #endif
#endif // TEST_QT_DLL_GLOBAL_H Это значит, я могу приписывать TEST_QT_DLL_EXPORT к каждому классу в библиотеке или нужно создавать каждый раз новый такой файл?
Название: Re: Создание динамической библиотеки
Отправлено: CJ1 от Июль 10, 2012, 07:21
каждому классу можно приписывать, а какая разница то
|