Название: windows dll-ка на Qt Отправлено: 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 QtDll.cpp Код: // QtDll.cpp : Defines the entry point for the DLL application. Что я не так делаю? Так, с 3-им пунктом разобрался.. Просто забыл добавить h-файл dll-ки в проект :). p.s. Кстати, может у кого-нибудь есть пример на эту тему? Название: windows dll-ка на Qt Отправлено: ElderOrb от Январь 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" длл-ка скомпилилась, но зависимость от рунтайма не исчезла. За время всех этих манипуляций (их было куда больше чем я написал) у меня исчезли последние остатки понимания происходящего. Очень надоело плясать с бубном! Помогите, пожалуйста! Название: windows dll-ка на Qt Отправлено: fanat9 от Январь 11, 2006, 17:09 Поясни подробнее что значит "можно ли вообще использовать Qt в "обычных" длл-ках ?"
Я пробывал делать qt dll и подключать её к qt проекту - могу кинуть пример + эту тему тут обсуждали несколько раз. Статически эту dll скопилить ? Why not ? Насчет второго вопроса не знаю ничего =( Название: windows dll-ка на Qt Отправлено: ElderOrb от Январь 11, 2006, 17:20 Насколько я знаю есть "regular" dll а есть "extension". Этих extension самых разных немеряно и все они позволяют множество интересных фишек, типо экспортирования классов, однако есть у них и минус. Если написать такую дллку в вижуале, прицепить её к дэльфишному проэкту не получится. Чтобы получилось длл-ка должна быт именно "regular", (то что я называю "обычная").
Я бы не не стал писать первый пост в этой ветке, если бы видел примеры regular dll с использованием Qt. Всё что я доселе видел - были extensions, а мою длл-ку будут использовать мфцшники и дэльфятники. Я долго ковырялся и в итоге собрал regular dll статически (второй пост), однака без run-time. Осталось только каким-то образом заставить рантайм влинковаться в длл-ку и проблема будет решена полностью. |