Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2014, 16:00   #1
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию Пошаговая инструкция. Создание и использование Dll

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

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

Создание Dll

- запускаем Qt Creator
- в меню выбираем "File" -> "New File or Project..."
- в разделе "Projects" выбираем "Libraries"
- в центральном разделе выбираем "C++ Library" -> нажимаем кнопку "Choose..."
- в выпадающем списке: Shared Library
- имя проекта: Person
- выбираем путь, где будет создан проект, к примеру: D:\Documents\Qt\QtDeploying\0001_dl l_Person
- нажимаем "Next" -> "Next" -> "Next" -> "Finish"

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

Код:
#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" следующим образом:

Код:
#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_Us ageOfPersonDll
- нажимаем "Next" -> "Next" -> "Finish"
- копируем в папку с проектом файлы: person.h, person_global.h и Person.dll
- подключаем к проекту файлы "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"):
Код:
LIBS += "..\build-UsageOfPersonDll-Desktop_Qt_5_2_0_MinGW_32bit-Debug\debug\Person.dll"
Примечание. Для построения релизной версии проекта нужно в "UsageOfPersonDll.pro" добавить эту строку:
Код:
LIBS += "..\build-UsageOfPersonDll-Desktop_Qt_5_2_0_MinGW_32bit-Release\release\Person.dll"
Изменяем файл "main.cpp" следующим образом:

Код:
#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)
8Observer8 вне форума Ответить с цитированием
Старый 17.02.2014, 16:19   #2
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,619
По умолчанию

Под другие платформы как собирать? Это ведь раздел кроссплатформенного программирования.
MaTBeu вне форума Ответить с цитированием
Старый 17.02.2014, 16:22   #3
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Цитата:
Сообщение от MaTBeu Посмотреть сообщение
Под другие платформы как собирать? Это ведь раздел кроссплатформенного программирования.
Да, Вы правы Я обязательно составлю такую инструкцию для Linux
8Observer8 вне форума Ответить с цитированием
Старый 23.02.2014, 22:46   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

В целом, забавно. Но есть там еще Qt Plugin: http://qt-project.org/doc/qt-4.8/plugins-howto.html
Я так понимаю, это примерно та же DLL но чуть более удобная. Если она удобнее, то зачем нам собирать DLL с Qt?

Единственная мотивация собрать DLL, ИМХО, это возможность прикрутить его к другому приложению, не использующему Qt (и по этой причине не способному сожрать плагин).
Но если наше приложение, использующее DLL не исопльзует Qt, то и QString, например, оно не сожрет (а в вашем примере оно используется). Это значит, что с одной стороны, пример не очень хороший. С другой стороны, у Шлее пример не лучше. С третьей стороны, зачем нам собирать с Qt DLL, в которой Qt вообще ни разу не используется?

Поэтому в сборке DLL на Qt я смысла вообще не вижу. Поправьте если не прав.

А по системе плагинов в Qt есть статья на русском языке: http://pro-prof.com/archives/1316 (плагины реализуют различные методы интегрирования). В принципе, ничего не мешает вместо плагинов использовать DLL и в этом примере, но геморроя больше. Зачем нам геморрой?
rrrFer вне форума Ответить с цитированием
Старый 23.02.2014, 22:50   #5
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

Опять же, вот тут описано как подключать DLL статически. Это не интересно. А вот если делать это динамически (ну как фар, например плагины подключает свои - ищет в известном каталоге все подряд DLL...), это более интересно. Но надо проверять чтобы библиотека реализовывала нужный нам интерфейс (иначе приложение будет падать если кто-нибудь кинет в каталог фару левый DLL). Но а плагины в кьют элегантно решают эту проблему - все встроено и удобно из коробки.
rrrFer вне форума Ответить с цитированием
Старый 01.05.2016, 12:54   #6
ctakah3112
Новичок
Джуниор
 
Регистрация: 01.05.2016
Сообщений: 1
По умолчанию В чем смысл?

Если вы вставляете в рабочий проект не только саму библиотеку (dll), но и заголовочный и исходник Person.h, Person.cpp, то зачем вообще нужна библиотека? Можно было с таким же успехом эти два файла просто запихнуть и использовать все функции оттуда, а dll вообще не нужна. Бред какой-то
ctakah3112 вне форума Ответить с цитированием
Старый 01.05.2016, 12:58   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так без срр же вроде.
Цитата:
копируем в папку с проектом файлы: person.h, person_global.h и Person.dll
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 01.05.2016, 13:21   #8
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Цитата:
В чем смысл?
Я лично вкладывал смысл показать наглядно как создавать и использовать dll. А для чего использовать dll это уже каждый решает сам
8Observer8 вне форума Ответить с цитированием
Старый 10.05.2016, 13:25   #9
Avazart
Форумчанин
 
Аватар для Avazart
 
Регистрация: 13.08.2011
Сообщений: 184
По умолчанию

Цитата:
Сообщение от 8Observer8
LIBS += "..\build-UsageOfPersonDll-Desktop_Qt_5_2_0_MinGW_32bit-Debug\debug\Person.dll"
Путь должен быть не к dll а к библиотеке импорта для MSVC это *.lib для MinGW если не ошибаюсь *.dll.a
и указывать стоит без расширения.

Цитата:
Сообщение от rrrFer
как подключать DLL статически
Нет такого понятия.
Статически можно "подключить" только статичекую библиотеку(*.a и *.lib) .

С остальным согласен, плагины более интересная тема.

К тому же экспорт классов в DLL делают DLL менее "переносимой" и вариант:
Цитата:
Сообщение от rrrFer
это возможность прикрутить его к другому приложению
менее возможным.

Последний раз редактировалось Avazart; 10.05.2016 в 13:48.
Avazart вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Инструкция для сборки приложений на Qt в один exe без зависимостей от libstdc++-6.dll, libgcc_s_dw2-1.dll, Qt5Core.dll и т.д. 8Observer8 Qt и кроссплатформенное программирование С/С++ 12 25.06.2015 03:18
Пошаговая инструкция. Создание юнит-тестов (модульных тестов) на Qt C++. Разработка через тестирование (TDD - test-driven developm 8Observer8 Qt и кроссплатформенное программирование С/С++ 15 26.06.2014 09:33
Пошаговая инструкция по Git. Сохранение файлов проекта на удалённый сервер (github.com) 8Observer8 Общие вопросы C/C++ 9 23.02.2014 14:48
Создание и использование библиотеки DLL Blew Помощь студентам 0 06.02.2011 14:56
Создание\использование своих DLL библиотек Vol666 Общие вопросы Delphi 5 26.08.2009 11:55