Russian Qt Forum

Qt => Вопросы новичков => Тема начата: libertas от Март 19, 2014, 14:47



Название: Пример создания .dll c помощью VC для клиента на qt. неявное связывание
Отправлено: libertas от Март 19, 2014, 14:47
Здравствуйте, может у кого есть пример создания .dll c помощью VC для клиента на qt, неявное связывание?

Спасибо.


Название: Re: Пример создания .dll c помощью VC для клиента на qt. неявное связывание
Отправлено: OKTA от Март 19, 2014, 14:50
берешь студию, создаешь новый проект, выбираешь в тэмплейтах библиотеку...  ???


Название: Re: Пример создания .dll c помощью VC для клиента на qt. неявное связывание
Отправлено: libertas от Март 19, 2014, 14:56
Код:
берешь студию, создаешь новый проект, выбираешь в тэмплейтах библиотеку...

Это я сделал, спасибо.

А вот дальше не понимаю.

Написал вот такой код в хедере:

Код:
#ifdef IMPLICITBINDINGDLL_EXPORTS
#define IMPLICITBINDINGDLL_API __declspec(dllexport)
#else
#define IMPLICITBINDINGDLL_API __declspec(dllimport)
#endif

extern "C" {
#ifdef IMPLICIT
__declspec(dllexport) double add(double, double);
#else
Q_DECL_IMPORT double add(double, double);
#endif
}

И не понимаю в нем, что значить IMPLICIT, а Q_DECL_IMPORT - у меня подсвечивает компилятор как this declaration has no storage class or type specifier.

И не знаю куда мне нужно файлы библиотеки сохранять, чтоб потом можно было удобно импортировать их в клиента.


Название: Re: Пример создания .dll c помощью VC для клиента на qt. неявное связывание
Отправлено: OKTA от Март 19, 2014, 15:11
Ты вроде недавно это уже делал, только в креаторе... Что теперь изменилось? зачем студия понадобилась? И зачем такой код написал, если не понимаешь?  ???


Название: Re: Пример создания .dll c помощью VC для клиента на qt. неявное связывание
Отправлено: libertas от Март 19, 2014, 15:14
Код:
Что теперь изменилось? зачем студия понадобилась? И зачем такой код написал, если не понимаешь?

У меня это лабораторная в институте. И такое задание. А код такой написал, потому что он был в качестве образца в лаб. с чего начать=)


Название: Re: Пример создания .dll c помощью VC для клиента на qt. неявное связывание
Отправлено: OKTA от Март 19, 2014, 15:28
Тебе нужна просто библиотека, как раньше?  Не использующая Qt? Если да, то вот мануал тебе http://life-prog.ru/view_zam.php?id=189&cat=2&page=3


Название: Re: Пример создания .dll c помощью VC для клиента на qt. неявное связывание
Отправлено: libertas от Март 19, 2014, 15:43
Код:
мануал тебе http://life-prog.ru/view_zam.php?id=189&cat=2&page=3

за мануал спасибо. почитаю.

А мне нужно, чтоб библиотеку написаннуя в visual studio можно использовать в qt проекте.


Название: Re: Пример создания .dll c помощью VC для клиента на qt. неявное связывание
Отправлено: libertas от Март 20, 2014, 09:11
Я создал библиотеку. Как загрузчик ОС сможет найти мою библиотеку? Точнее, где мне можно её разместить, чтоб загрузчик ОС её нашел при запуске клиента?


Название: Re: Пример создания .dll c помощью VC для клиента на qt. неявное связывание
Отправлено: Bepec от Март 20, 2014, 09:21
Эмм... Загрузчик ОС будет использовать вашу библиотеку?


Название: Re: Пример создания .dll c помощью VC для клиента на qt. неявное связывание
Отправлено: Old от Март 20, 2014, 09:25
Я создал библиотеку. Как загрузчик ОС сможет найти мою библиотеку? Точнее, где мне можно её разместить, чтоб загрузчик ОС её нашел при запуске клиента?
Рядом с клиентом положите или в любую из директорий прописанных в PATH.


Название: Re: Пример создания .dll c помощью VC для клиента на qt. неявное связывание
Отправлено: OKTA от Март 20, 2014, 09:26
;D ;D ;D стоит положить в папочку с exe-шником
А насчет загрузчика ОС - осторожнее с выражениями  ;D ;D http://ru.wikipedia.org/wiki/NTLDR


Название: Re: Пример создания .dll c помощью VC для клиента на qt. неявное связывание
Отправлено: libertas от Март 20, 2014, 09:31
Код:
Загрузчик ОС будет использовать вашу библиотеку?

Я сделал так:
din_lib.h :

Код:
extern "C" {
#ifdef IMPLICIT
__declspec(dllexport) double add(double, double);
#else
Q_DECL_IMPORT double add(double, double);
#endif
}

din_lib.cpp
Код:
#include "stdafx.h"
#include "din_lib.h"

extern "C" {
#ifdef IMPLICIT
__declspec(dllexport) double add(double first, double second){
return first + second;
}
#else
Q_DECL_IMPORT double add(double first, double second) {
return first + second;
#endif
}
Собрал библиотеку. У меня появились 4 файла: din_lib.exp, din_lib.lib, din_lib.pdb, din_lib.dll Я их разместил в папке:
"D:\Temp\C++\QT_labs\lib"

В файле client_dll.pro в qt проекте указал:
Код:
INCLUDEPATH += D:/Temp/C++/project/din_lib/din_lib/ #путь до хедера

LIBS += D:/Temp/C++/QT_labs/lib/din_lib.lib #путь до библиотеки

Но при запуске приложения на qt он :

Starting D:\Temp\C++\QT_labs\client_dll\debug\client_dll.exe...
The program has unexpectedly finished.
D:\Temp\C++\QT_labs\client_dll\debug\client_dll.exe crashed

Вот я и подумал, что загрузчик ОС не может найти мою библиотеку...Поправьте, если ошибаюсь..


Название: Re: Пример создания .dll c помощью VC для клиента на qt. неявное связывание
Отправлено: libertas от Март 20, 2014, 10:14
Все, разобрался.

Разместил файл библиотеки в проекте клиента и прописал путь к ней в client_dll.pro

LIBS += D:/Temp/C++/QT_labs/client_dll/din_lib.lib

и все заработало. Судя по всему оттуда загрузчик ОС может взять библиотеку.


Название: Re: Пример создания .dll c помощью VC для клиента на qt. неявное связывание
Отправлено: Bepec от Март 20, 2014, 10:24
Тьфу блин, этот лексикон юных меня доканает :D А я голову ломал, что он собирает с системой делать :D


Название: Re: Пример создания .dll c помощью VC для клиента на qt. неявное связывание
Отправлено: OKTA от Март 21, 2014, 10:06
Код:
Загрузчик ОС будет использовать вашу библиотеку?

Я сделал так:
din_lib.h :

Код:
extern "C" {
#ifdef IMPLICIT
__declspec(dllexport) double add(double, double);
#else
Q_DECL_IMPORT double add(double, double);
#endif
}

din_lib.cpp
Код:
#include "stdafx.h"
#include "din_lib.h"

extern "C" {
#ifdef IMPLICIT
__declspec(dllexport) double add(double first, double second){
return first + second;
}
#else
Q_DECL_IMPORT double add(double first, double second) {
return first + second;
#endif
}
Собрал библиотеку. У меня появились 4 файла: din_lib.exp, din_lib.lib, din_lib.pdb, din_lib.dll Я их разместил в папке:
"D:\Temp\C++\QT_labs\lib"

В файле client_dll.pro в qt проекте указал:
Код:
INCLUDEPATH += D:/Temp/C++/project/din_lib/din_lib/ #путь до хедера

LIBS += D:/Temp/C++/QT_labs/lib/din_lib.lib #путь до библиотеки

Но при запуске приложения на qt он :

Starting D:\Temp\C++\QT_labs\client_dll\debug\client_dll.exe...
The program has unexpectedly finished.
D:\Temp\C++\QT_labs\client_dll\debug\client_dll.exe crashed

Вот я и подумал, что загрузчик ОС не может найти мою библиотеку...Поправьте, если ошибаюсь..

Не, тут что-то другое. Без .lib файла клиент просто не собрался бы. Линкер должен ругаться на udefined reference.