Russian Qt Forum
Ноябрь 24, 2024, 22:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Создание динамической библиотеки  (Прочитано 6099 раз)
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 ==========

(Я пропустил часть вывода, так как размер сообщения превышал допустимый максимум для форума)
С чем это связано и что я делаю не так?
Записан
mutineer
Гость
« Ответ #1 : Июль 09, 2012, 12:59 »

Qt-либы в проект подключал?
Записан
nevero
Гость
« Ответ #2 : Июль 09, 2012, 13:01 »

Я создаю проект библиотеки, там прописаны автоматически пути.
Записан
CJ1
Гость
« Ответ #3 : Июль 09, 2012, 14:24 »

Здесь явно нужны либы
Записан
mutineer
Гость
« Ответ #4 : Июль 09, 2012, 14:26 »

Линкеру твои автоматические пути чем-то не нравятся или он не хочет их использовать
Записан
nevero
Гость
« Ответ #5 : Июль 09, 2012, 14:39 »

Тогда что конкретно должно быть прописано?
Может статьи уже есть (поиск по не дал нормального результата) ?
Записан
CJ1
Гость
« Ответ #6 : Июль 09, 2012, 14:43 »

Может стоит попробовать напрямую указать либы,
#pragma comment(lib,"QtCore4.lib")

И так все необходимые


Записан
nevero
Гость
« Ответ #7 : Июль 09, 2012, 15:00 »

Действительно, QtGui4.lib не хватало. Значит надо вручную контролировать....

Спасибо за помощь!
Записан
CJ1
Гость
« Ответ #8 : Июль 09, 2012, 15:06 »

Да, помойму если в файле pro указать LIBS += QtGui4.lib будет тот же эффект
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #9 : Июль 09, 2012, 15:48 »

очевидно, что проект не линкуется с QtGui
Записан
nevero
Гость
« Ответ #10 : Июль 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 к каждому классу в библиотеке или нужно создавать каждый раз новый такой файл?
Записан
CJ1
Гость
« Ответ #11 : Июль 10, 2012, 07:21 »

каждому классу можно приписывать, а какая разница то
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 22.