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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Добавление CustomWidget, линковка  (Прочитано 3897 раз)
SpiritFire
Гость
« : Октябрь 20, 2009, 17:50 »

Прошу прощения за глупый вопрос, долго ковырялся с примером, создал свой виджет и бодавил его в Designer. Вроде все хорошо, но при добавлении его на пустую форму и сборке вылазят ошибки вида:

Код:
debug/mainwindow.o: In function `ZN10MainWindowD0Ev':
D:/Qt_projects/GraphTest/mainwindow.cpp:13: undefined reference to `GraphWidget::GraphWidget(QWidget*)'

Вот проектный файл плагина, все указал.
Код:
QT += opengl
CONFIG += designer \
    plugin
TARGET = $$qtLibraryTarget($$TARGET)
TEMPLATE = lib
QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/designer
HEADERS += ../ui_graphwidget.h \
    ../SinFunctor.h \
    ../HorizontalLineBar.h \
    ../graphwidget.h \
    ../GraphView.h \
    ../GraphItem.h \
    ../VerticalLineBar.h \
    GraphWidgetInterface.h
SOURCES += ../VerticalLineBar.cpp \
    ../HorizontalLineBar.cpp \
    ../graphwidget.cpp \
    ../GraphView.cpp \
    ../GraphItem.cpp \
    GraphWidgetInterface.cpp

# install
target.path = $$[QT_INSTALL_PLUGINS]/designer
sources.files = $$SOURCES \
    $$HEADERS \
    *.pro
sources.path = $$[QT_INSTALL_EXAMPLES]/designer/customwidgetplugin
INSTALLS += target \
    sources

Помогите, пожалуйста, в чем проблема?
Указанный конструктор находится в файле "../graphwidget.cpp", который в проект виджета включен, объектный файл плагина (.а) лежит в /plugins/designer... В чем-то туплю, а вот в чем понять не могу
Записан
Rcus
Гость
« Ответ #1 : Октябрь 20, 2009, 18:21 »

/* Выжимка из потока негодования по поводу непонимания устройства toolchain */
Посмотрите на список библиотек подключенных в проект, если среди них есть экспортирующая ваш класс то посмотрите какие символы она экспортирует (objdump/depwalker), если найдется нужный то это интересно, иначе g Q_DECL_EXPORT/LIBS+=
Записан
SpiritFire
Гость
« Ответ #2 : Октябрь 20, 2009, 19:14 »

/* Выжимка из потока негодования по поводу непонимания устройства toolchain */
Посмотрите на список библиотек подключенных в проект, если среди них есть экспортирующая ваш класс то посмотрите какие символы она экспортирует (objdump/depwalker), если найдется нужный то это интересно, иначе g Q_DECL_EXPORT/LIBS+=

Извините, но можно подробнее, или ссылку что почитать? Я с Qt знаком ровно две недели, g++ юзал дольше, под линухом, но что генерируется Qt-ями я без понятия.

Ну, с ".о" - это понятно, объектники. а что такое ".а"-файл? Я так понимаю, сама библиотека? При ее добавлении то же самое.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #3 : Октябрь 20, 2009, 22:11 »

Программа не линкуется с виджетом!

Проект программы на форме которой лежит ваш катомный виджет должен линковаться с ним

в про файле что-то типа


INCLUDEPATH += /CUSTOM_WIDGET_INCLUDE_DIR

LIBS += -LCUSTOM_WIDGET_LIB_DIR
  -lCUSTOM_WIDGET_LIBRARY_NAME
Записан
zamnach
Гость
« Ответ #4 : Октябрь 21, 2009, 14:56 »

попробуйте удалить из секций HEADER и SOURCE pro-файла упоминания файлов плагина.
Записан
SpiritFire
Гость
« Ответ #5 : Октябрь 23, 2009, 15:40 »

попробуйте удалить из секций HEADER и SOURCE pro-файла упоминания файлов плагина.
Их там нет.

Программа не линкуется с виджетом!

Проект программы на форме которой лежит ваш катомный виджет должен линковаться с ним

в про файле что-то типа


INCLUDEPATH += /CUSTOM_WIDGET_INCLUDE_DIR

LIBS += -LCUSTOM_WIDGET_LIB_DIR
  -lCUSTOM_WIDGET_LIBRARY_NAME

Либа - это файл с расширением ".а" - я правильно понял? Тогда вероятно, что в нем не описываются нужные мне экспорты, потому что в проекте прилинковал. В проекта или исходниках плагина нужно как-то упоминать, что определенная функция должна экспортироваться? Если да, то как?
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #6 : Октябрь 24, 2009, 01:20 »

.a в случае статической линковки, в случае динамической .so в Linux или .dll в Windows но в файлах проекта они указываются без расширений - только имена

Для корректного экспорта вашего виджета - нужно использовать директиву Q_DECL_EXPORT для всех классов в библиотеке а для самого класса кастомного виджета директиву QDESIGNER_WIDGET_EXPORT - вместо нее. Во вложении шлю вам пример одного компонента - светодиодик кот. горит или не горит - код тривиален подсмотрите все что вам нужно и сделайте аналогично. Для использования такого виджета в проекте программы надо добавить


INCLUDEPATH += ../CustomWidgets/QLED

LIBS += -L../lib \
-lQLED


Но вам надо разобраться с относительными путями в проекте - у меня так и программа и виджет в одном родительском проекте subdirs

ПРОГРАММА
ВИДЖЕТЫ
------КАCТОМНЫЙ ВИДЖЕТ

а все динамически библиотеки в том числе и кастомные виджеты компилируются и кладутся в общую папку lib внутри главного каталога проекта

LIB
ПРОГРАММА
ВИДЖЕТЫ
------КАСТОМНЫЙ ВИДЖЕТ

поэтому в прошнике моей программы строка "-L../lib" указывает где лежат Библиотеки, а "-lQLED" указывает какую из них слинковать с программой.

В виджете стоит DESTDIR = ../../lib чтобы его библиотека попала в ту самою папку lib

Я не являюсь автором данного компонента - а только использую его - все указания на автора сохранены!
« Последнее редактирование: Октябрь 24, 2009, 01:22 от break » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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