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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Пошаговая инструкция. Создание и использование Dll  (Прочитано 23546 раз)
8Observer8
Гость
« : Февраль 17, 2014, 14:45 »

Инструментарий

Операционная система: Windows 7
Версия Qt: Qt 5.2.0 for Windows 32-bit (MinGW 4.8, OpenGL)

Создание Dll

- запускаем Qt Creator
- если у Вас Qt Creator на русском, то я рекомендовал бы переключиться на английский. Для этого выбираем в меню "Инструменты" -> "Параметры..."
- в окне "Параметры" слева выбираем "Среда" -> открываем вкладку "Основные" -> выбираем в выпадающем списке "English" -> нажимаем кнопку "OK" -> перезапускаем Qt Creator
- в меню выбираем "File" -> "New File or Project..."
- в разделе "Projects" выбираем "Libraries"
- в центральном разделе выбираем "C++ Library" -> нажимаем кнопку "Choose..."
- в выпадающем списке: Shared Library
- имя проекта: Person
- выбираем путь, где будет создан проект, к примеру: D:\Documents\Qt\QtDeploying\0001_dll_Person
- нажимаем "Next" -> "Next" -> "Next" -> "Finish"

Изменяем файл "person.h" следующим образом:

Код
C++ (Qt)
#ifndef PERSON_H
#define PERSON_H
 
#include "person_global.h"
#include <QString>
 
class PERSONSHARED_EXPORT Person
{
public:
   Person();
   Person(const QString &firstName, const QString &secondName, int age);
 
   QString firstName() const;
   void setFirstName(const QString &firstName);
 
   QString secondName() const;
   void setSecondName(const QString &secondName);
 
   int age() const;
   void setAge(int age);
 
private:
   QString mFirstName;
   QString mSecondName;
   int mAge;
};
 
#endif // PERSON_H
 

- создаём реализации для функций, для этого последовательно нажимаем правой кнопкой мыши по каждой функции и выбираем "Refactor" -> выбираем "Add difinition in person.cpp"

Изменяем файл "person.cpp" следующим образом:

Код
C++ (Qt)
#include "person.h"
 
Person::Person() :
   mFirstName(""),
   mSecondName(""),
   mAge(0)
{
}
 
Person::Person(const QString &firstName, const QString &secondName, int age) :
   mFirstName(firstName),
   mSecondName(secondName),
   mAge(age)
{
}
 
QString Person::firstName() const
{
   return mFirstName;
}
 
void Person::setFirstName(const QString &firstName)
{
   mFirstName = firstName;
}
 
QString Person::secondName() const
{
   return mSecondName;
}
 
void Person::setSecondName(const QString &secondName)
{
   mSecondName = secondName;
}
 
int Person::age() const
{
   return mAge;
}
 
void Person::setAge(int age)
{
   mAge = age;
}
 

Создадим debug-версию dll:

- в меню выбираем "Build" -> "Build Project Person"

Создадим release-версию dll:

- нажимаем кнопку "Projects" на панели слева
- в разделе "Build Settings" в списке "Edit build configuration" выбираем: Release
- в разделе "Build Steps" напротив "qmake" нажимаем "Details"
- в списке "qmake build configuration" выбираем "Release"
- в поле "Additional arguments" вводим (в двойных кавычках): "CONFIG += release"
- в меню выбираем "Build" -> "Build Project Person"
- переходим в папку "release" проекта, там находится dll "Person.dll"
- теперь мы можем использовать в других проектах файлы: person.h, person_global.h и Person.dll

Использование Dll

- в меню выбираем "File" -> "New File or Project..."
- в разделе "Projects" выбираем "Applications"
- в центральном разделе выбираем "Qt Console Application" -> нажимаем кнопку "Choose..."
- имя проекта: UsageOfPersonDll
- выбираем путь, где будет создан проект, к примеру: D:\Documents\Qt\QtDeploying\0002_UsageOfPersonDll
- нажимаем "Next" -> "Next" -> "Finish"
- копируем в папку с проектом файлы: person.h, person_global.h
- подключаем к проекту файлы "person.h" и "person_global.h", для этого кликаем правой кнопкой мыши по имени проекта в Qt Creator и выбираем "Add Existing Files" -> выделяем "person.h" и "person_global.h" -> нажимаем "Open"
- в меню выбираем "Build" -> "Build Project UsageOfPersonDll"
- копируем файл "Person.dll" из папки "debug" проекта "Person" в папку "debug" проекта "UsageOfPersonDll"
- копируем файл "Person.dll" из папки "release" проекта "Person" в папку "debug" проекта "UsageOfPersonDll"
- открываем файл "UsageOfPersonDll.pro" и добавляем следующую строку (путь к "Person.dll"):
Код
C++ (Qt)
LIBS += "..\build-UsageOfPersonDll-Desktop_Qt_5_2_0_MinGW_32bit-Debug\debug\Person.dll"
 

Примечание. Для построения релизной версии проекта нужно в "UsageOfPersonDll.pro" добавить эту строку:
Код
C++ (Qt)
LIBS += "..\build-UsageOfPersonDll-Desktop_Qt_5_2_0_MinGW_32bit-Release\release\Person.dll"
 

Изменяем файл "main.cpp" следующим образом:

Код
C++ (Qt)
#include <QCoreApplication>
#include "person.h"
#include <QDebug>
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
 
   Person Bob("Bob", "Steventson", 20);
 
   qDebug() << "First Name: " << Bob.firstName();
   qDebug() << "Second Name: " << Bob.secondName();
   qDebug() << "Age: " << Bob.age();
 
   return a.exec();
}
 

- в меню выбираем "Build" -> "Run" (или Ctrl+R)
« Последнее редактирование: Март 13, 2014, 06:50 от 8Observer8 » Записан
OKTA
Гость
« Ответ #1 : Февраль 17, 2014, 14:47 »

В догонку общая полезная информация о динамических библиотеках)

http://citforum.ru/book/cook/dll0.shtml
http://citforum.ru/book/cook/dll1.shtml
Записан
Caballero
Гость
« Ответ #2 : Март 05, 2014, 16:04 »

Добрый день, я новичок, помогите, пожалуйста Улыбающийся. Все сделала по инструкции, при сборке проекта UsageOfPersonDll  пишет ошибку "no such file or directory". В инете не нашла ответа, который бы решил мою проблему. Прилагаю скриншот pro. файла с ошибкой.
Записан
OKTA
Гость
« Ответ #3 : Март 05, 2014, 16:16 »

1. Не используйте в путях русский буквы;
2. Тут надо не dll подключать, а lib. Dll понадобится уже потом, когда программа будет запускаться - здесь даже смысла нет их прописывать.
Записан
8Observer8
Гость
« Ответ #4 : Март 13, 2014, 06:49 »

Добрый день, я новичок, помогите, пожалуйста Улыбающийся. Все сделала по инструкции, при сборке проекта UsageOfPersonDll  пишет ошибку "no such file or directory". В инете не нашла ответа, который бы решил мою проблему. Прилагаю скриншот pro. файла с ошибкой.

Переключите Qt Creator на английский, тогда у Вас не будет в путях русских символов. Посмотрите на свой скриншот в самом низу, там в путях кракозябы.

- выбираем в меню "Инструменты" -> "Параметры..."

- в окне "Параметры" слева выбираем "Среда" -> открываем вкладку "Основные" -> выбираем в выпадающем списке "English" -> нажимаем кнопку "OK" -> перезапускаем Qt Creator
Записан
OKTA
Гость
« Ответ #5 : Март 13, 2014, 07:23 »

В моем креаторе не канает  Смеющийся
Записан
8Observer8
Гость
« Ответ #6 : Март 13, 2014, 08:25 »

В моем креаторе не канает  Смеющийся

Какая у Вас версия SDK и версия Creator'а?

У меня:
- SDK - Qt 5.2.0
- Qt Creator - 3.0.0
Записан
OKTA
Гость
« Ответ #7 : Март 13, 2014, 09:38 »

Qt Creator 2.3.1  Смеющийся
Записан
8Observer8
Гость
« Ответ #8 : Март 13, 2014, 09:42 »

Qt Creator 2.3.1  Смеющийся

Будем надеються, что у Caballero версия больше или равна той, что я использую Улыбающийся
Записан
vorotislav
Гость
« Ответ #9 : Март 18, 2015, 21:41 »

Доброго времени суток.
Благодарю за инструкцию! Все по полочкам, а главное работает. (зы Win8.1, Qt 5.4)
Но у меня возник вопрос.
Я тут решил разобраться с такой темой, как поддержка сети в своей программе. Проще говоря, пишу свой клиент-серверный чатик. Класс, для работы с сокетом решил сделать по паттерну Adapter, в связи с чем появилось как минимум 2 класса (исходя из паттерна).
Далее возникла идея, раз и клиент и сервер пользуются этими классами, и они должны быть одинаковы (там прописана логика разбора пакета), то логично было бы их менять в одном месте и быть уверенным, что изменения будут доступны всем. По этой причине, захотел попутно разобраться с dll. И вот беда, во первых существует сразу несколько способов, как сделать dll. Во вторых, возможно ли запихать в длл абстракный класс + класс реализации паттера + класс реализации для сокета (и для сервера). Хотя думаю, последнее можно в программе определить на основе длл? И как лучше сделать, как отдельная библиотека или как плагин?
Буду рад любым советам. Заранее благодарен.
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #10 : Август 17, 2016, 10:51 »

Вот эти вещи надо разруливать метаусловиями.
Код:
LIBS += "..\build-UsageOfPersonDll-Desktop_Qt_5_2_0_MinGW_32bit-Debug\debug\Person.dll"
LIBS += "..\build-UsageOfPersonDll-Desktop_Qt_5_2_0_MinGW_32bit-Release\release\Person.dll"
Код:
CONFIG (debug, debug|release) {
LIBS += "..\build-UsageOfPersonDll-Desktop_Qt_5_2_0_MinGW_32bit-Debug\debug\Person.dll"
}else{
LIBS += "..\build-UsageOfPersonDll-Desktop_Qt_5_2_0_MinGW_32bit-Release\release\Person.dll"
}
 
А не лазить каждый раз править профайл..
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #11 : Август 17, 2016, 11:18 »

panAlexey, у вас либа собирается в ..\build-UsageOfPersonDll-Desktop_Qt_5_2_0_MinGW_32bit-Debug\debug\Person.dll
а у меня либа собирается в  .\build\UsageOfPersonDll-Desktop_Qt_5_2_0_MinGW_32bit-Debug\debug\Person.dll
а под линуксом в .\build\UsageOfPersonDll-Desktop_Qt_5_2_0_MinGW_32bit-Debug\libPerson.so"
Как это обработать?

Кстати, имхо, либы лучше записывать
Код:
LIBS += -L"Path/to/lib/dir -lnameOfLib
Тогда dll, so и т.д. сами разрешатся.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #12 : Август 17, 2016, 14:30 »

Цитировать
Как это обработать?

Использовать QBS.

А по теме, я разруливал так:

== либа ==

<project-dir>\sources\libs\core\core.pro :

Код:
TEMPLATE = lib
CONFIG += static c++11
QT += network
TARGET = $$qtLibraryTarget($$TARGET)
SOURCES = ...
HEADERS = ...

== аппликуха ==

<project-dir>\sources\apps\myapp\myapp.pro

Код:
TEMPLATE = app
CONFIG += c++11
QT += quick widgets
TARGET = $$qtLibraryTarget($$TARGET)
CONFIG(debug, debug|release):OBJECTS_DIR = debug
CONFIG(release, debug|release):OBJECTS_DIR = release
LIBS *= -L../../libs/core/$$OBJECTS_DIR -l$$qtLibraryTarget(core) // зависимость от либы с именем core
INCLUDEPATH *= ../../libs
DEPENDPATH *= ../../libs
..
..
# installs targets and resources
DESTDIR = $$top_builddir/deploy-apps/$$TARGET

Но, если честно, то QMake - тот еще гемомрой.  Подмигивающий
Записан

ArchLinux x86_64 / Win10 64 bit
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #13 : Август 17, 2016, 23:25 »

Но, если честно, то QMake - тот еще гемомрой.  Подмигивающий
++++
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Bepec
Гость
« Ответ #14 : Август 18, 2016, 00:58 »

Вот если б ещё доступно рассказали про соглашения, а так же как подружить mingw dll с msvc Веселый Ээх.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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