Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: dr_Begemot от Август 14, 2009, 15:43



Название: Проблема с dll-ками
Отправлено: 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-ки... Что, так и должно быть?




Название: Re: Проблема с dll-ками
Отправлено: alex12 от Август 15, 2009, 13:05
В h-файле 2-ой dll-ки не должно быть никаких подключений от первой. Это должен быть публичный заголовок, описывающий только 2-ю dll-ку. В исходниках 2 dll-ки подключать заголовки первой можно только в cpp-файлы, или если очень надо, сделать служебный h-файл.

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

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


Название: Re: Проблема с dll-ками
Отправлено: dr_Begemot от Август 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-файл? Чем он поможет? Не могли бы вы прояснить?

Спасибо)


Название: Re: Проблема с dll-ками
Отправлено: alex12 от Август 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