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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: windows dll-ка на Qt  (Прочитано 8277 раз)
ElderOrb
Гость
« : Январь 09, 2006, 18:10 »

Сразу скажу - в длл-ках я совершенно не силён, однако в скором времени мне придётся столкнуться с сабжем, в связи с чем следующие вопросы:
1. Можно ли будет скомпилить эту дллку статически? Если да - что для этого нужно?
2. Длл-ка будет выводить окна и взаимодействовать с пользователем. Можно ли сделать чтобы это взаимодействие шло напрямую, т.е. минуя вызывающую программу?.
3. Я создал тестовый проект QtDll, чтобы проверить, можно ли вообще использовать Qt в "обычных" длл-ках, создал второй проект, включил в него QtDll.h, в либы добавил QtDll.lib, попробовал потестить и получил ругань:
Цитировать
Linking...
QtDllTest.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) void __cdecl QtDll::Test(void)" (__imp_?Test@QtDll@@YAXXZ) referenced in function "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z)
C:\Projects\QtDllTest\QtDllTest\Debug\QtDllTest.exe : fatal error LNK1120: 1 unresolved externals


QtDll.h
Код:
#ifdef QTDLL_EXPORTS
#define QTDLL_API __declspec(dllexport)
#else
#define QTDLL_API __declspec(dllimport)
#endif

// This class is exported from the QtDll.dll
class QTDLL_API CQtDll {
public:
CQtDll(void);
// TODO: add your methods here.
};

extern QTDLL_API void Test();


QtDll.cpp
Код:
// QtDll.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "QtDll.h"
#include <QWidget>


#ifdef _MANAGED
#pragma managed(push, off)
#endif

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
    return TRUE;
}

#ifdef _MANAGED
#pragma managed(pop)
#endif

QTDLL_API void Test()
{

}


Что я не так делаю?
Так, с 3-им пунктом разобрался.. Просто забыл добавить h-файл dll-ки в проект Улыбающийся.

p.s.
Кстати, может у кого-нибудь есть пример на эту тему?
Записан
ElderOrb
Гость
« Ответ #1 : Январь 11, 2006, 13:02 »

Мне удалось собрать длл-ку статически (размер дебаг-версии ~6 мег), избавившись от зависимости от QtCore, QtGui, QtXml. Однако осталась зависимость от c run-time-а msvcr80d.dll. В случае с обыкновенной программой можно добиться этого установив в configuration properties-> c/c++->code generation->runtime library в Multi-threaded Debug (/MTd). Однако если это сделать для длл-ки - линкер изрыгает из себя вот такие сообщения:
Цитировать
MSVCRTD.lib(MSVCR80D.dll) : error LNK2005: __flushall already defined in LIBCMTD.lib(fflush.obj)
MSVCRTD.lib(MSVCR80D.dll) : error LNK2005: _memmove already defined in LIBCMTD.lib(memmove.obj)
MSVCRTD.lib(MSVCR80D.dll) : error LNK2005: _free already defined in LIBCMTD.lib(dbgheap.obj)
MSVCRTD.lib(MSVCR80D.dll) : error LNK2005: _malloc already defined in LIBCMTD.lib(dbgheap.obj)
MSVCRTD.lib(MSVCR80D.dll) : error LNK2005: _printf already defined in LIBCMTD.lib(printf.obj)
......
MSVCRTD.lib(MSVCR80D.dll) : error LNK2005: __get_osfhandle already defined in LIBCMTD.lib(osfinfo.obj)
MSVCRTD.lib(MSVCR80D.dll) : error LNK2005: __fileno already defined in LIBCMTD.lib(fileno.obj)
MSVCRTD.lib(MSVCR80D.dll) : error LNK2005: __write already defined in LIBCMTD.lib(write.obj)
MSVCRTD.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) already defined in LIBCMTD.lib(typinfo.obj)
MSVCRTD.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) already defined in LIBCMTD.lib(typinfo.obj)
MSVCRTD.lib(MSVCR80D.dll) : error LNK2005: __vsnprintf_s already defined in LIBCMTD.lib(vsnprnc.obj)
   Creating library C:\Projects\QtDll\QtDll\static-debug\QtDll.lib and object C:\Projects\QtDll\QtDll\static-debug\QtDll.exp
LINK : warning LNK4098: defaultlib 'MSVCRTD' conflicts with use of other libs; use /NODEFAULTLIB:library
C:\Projects\QtDll\QtDll\static-debug\QtDll.dll : fatal error LNK1169: one or more multiply defined symbols found
Build log was saved at "file://c:\Projects\QtDll\QtDll\static-debug\BuildLog.htm"
QtDll - 42 error(s), 1 warning(s)


После прописывания в ingore specific library "LIBCMTD.lib" длл-ка скомпилилась, но зависимость от рунтайма не исчезла. За время всех этих манипуляций (их было куда больше чем я написал) у меня исчезли последние остатки понимания происходящего. Очень надоело плясать с бубном! Помогите, пожалуйста!
Записан
fanat9
Гость
« Ответ #2 : Январь 11, 2006, 17:09 »

Поясни подробнее что значит "можно ли вообще использовать Qt в "обычных" длл-ках ?"

Я пробывал делать qt  dll  и подключать её к qt проекту - могу кинуть пример + эту тему тут обсуждали несколько раз.

Статически эту dll скопилить ? Why not ?

Насчет второго вопроса не знаю ничего =(
Записан
ElderOrb
Гость
« Ответ #3 : Январь 11, 2006, 17:20 »

Насколько я знаю есть "regular" dll а есть "extension". Этих extension самых разных немеряно и все они позволяют множество интересных фишек, типо экспортирования классов, однако есть у них и минус. Если написать такую дллку в вижуале, прицепить её к дэльфишному проэкту не получится. Чтобы получилось длл-ка должна быт именно "regular", (то что я называю "обычная").

Я бы не не стал писать первый пост в этой ветке, если бы видел примеры regular dll с использованием Qt. Всё что я доселе видел - были extensions, а мою длл-ку будут использовать мфцшники и дэльфятники. Я долго ковырялся и в итоге собрал regular dll статически (второй пост), однака без run-time. Осталось только каким-то образом заставить рантайм влинковаться в длл-ку и проблема будет решена полностью.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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