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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с dll-ками  (Прочитано 3426 раз)
dr_Begemot
Гость
« : Август 14, 2009, 15:43 »

есть 2 dll-ки
1я dll представляет собой кнопку, которая размещается на форме и обладает некоторыми специфичными функциями.
2я представляет собой виджет использующий эту кнопку.
Так же 1я dll с компилена в 2х вариантах - обычном и в варианте плагина, чтобы можно было работать с ней в Qt Disigner.

в pro-файле 2й dll-ки подключаю 1ю:
Код:
#Добавление библиотеки SpecButton
include($$ROOT/src/SpecButton/SpecButton.pri)
LIBS     += -L$$ROOT/lib $$SPECBUTTON_LIB
SpecButton.pri Представляет собой:
Код:
SPECBUTTON_LIB = -lSpecButton

INCLUDEPATH += $$ROOT/src/SpecButton/include
DEPENDPATH  += $$ROOT/src/SpecButton
Далее в тесте аналогично подрубаю ТОЛЬКО 2ю dll:
Код:
#Добавление библиотеки Plotter
include($$ROOT/src/Plotter/Plotter.pri)
LIBS     += -L$$ROOT/lib $$PLOTTER_LIB

При компиляции теста компилятор ругается и указывает на:
ui_PlotterView.h(30) : fatal error C1083: Cannot open include file: 'SpecButton.h': No such file or directory

Фишка в том, что в ui_PlotterView.h, SpecButton.h подключен как
#include "SpecButton.h"
а не
#include <SpecButton.h>

Если же в тест подключить обе библиотеки то все ок.
Ворос в том, что, как мне кажется, так не должно быть. Поскольку тест не должен ничего знать о кнопке, он просто подключает Plotter1.dll, но при прдключении plotter.h, доходит до SpecButton.h в кавычках(!), пытается ее найти и не получается.

UPD.: Дело все таки не в кавыках или угловатых скобках... Даже если в <> то все равно тест требует путь до заголовочника той библиотеки, которая подключена ко 2й dll-ки... Что, так и должно быть?


« Последнее редактирование: Август 14, 2009, 16:07 от dr_Begemot » Записан
alex12
Гость
« Ответ #1 : Август 15, 2009, 13:05 »

В h-файле 2-ой dll-ки не должно быть никаких подключений от первой. Это должен быть публичный заголовок, описывающий только 2-ю dll-ку. В исходниках 2 dll-ки подключать заголовки первой можно только в cpp-файлы, или если очень надо, сделать служебный h-файл.

В случае с использованием ui-файлов подключать их надо без наследования.

И обязательно пользоваться конструкциями dllimport dllexport (поищи по форуму).
Записан
dr_Begemot
Гость
« Ответ #2 : Август 16, 2009, 21:54 »

В h-файле 2-ой dll-ки не должно быть никаких подключений от первой. Это должен быть публичный заголовок, описывающий только 2-ю dll-ку. В исходниках 2 dll-ки подключать заголовки первой можно только в cpp-файлы, или если очень надо, сделать служебный h-файл.

В случае с использованием ui-файлов подключать их надо без наследования.

И обязательно пользоваться конструкциями dllimport dllexport (поищи по форуму).


А как быть если в публичном заголовке 2й dll-ки описан класс, который использует (или наследует) класс(-ы) которые, в свою очередь, используют функционал описанный в 1й dll-ке???

"В исходниках 2 dll-ки подключать заголовки первой можно только в cpp-файлы, или если очень надо, сделать служебный h-файл." - а если надо унаследоваться от класса, который описан в 1й dll или использовать его? Не совсем понял про служебный h-файл? Чем он поможет? Не могли бы вы прояснить?

Спасибо)
Записан
alex12
Гость
« Ответ #3 : Август 18, 2009, 01:21 »

использует (или наследует)
Использует и наследует - принципиальная разница. Можно использовать, не подключая h-файл используемого класса, например:


a.h:
Код
C++ (Qt)
class B;
class C;
 
class A
{
public:
 A();
 virtual ~A();
 void f1( C *c );
 void f2( C &c );
private:
 B *b;
};

a.cpp:
Код
C++ (Qt)
#include "a.h"
#include "b.h"
#include "c.h"
 
A::A()
{
 b = new B;
}
 
A::~A()
{
 delete B;
}

Класс А использует B и C, но в h-файле только предварительная декларация (forwarding declaration). Можно использовать указатели и ссылки.

При наследовании нельзя обойтись без подключения h-файла родителя т.к. компилятор должен знать внутреннюю структуру класса предка.

По поводу служебных h-файлов надо поискать "техника d-указателей". Например, http://qt.osdn.org.ua/data-sharing.html
« Последнее редактирование: Август 18, 2009, 01:51 от alex12 » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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