Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: Admin от Ноябрь 07, 2008, 09:45



Название: QT4.4 full static + VC2008 - это утопия?
Отправлено: Admin от Ноябрь 07, 2008, 09:45
Хотелось бы узнать, есть ли возможность собрать QT на MSVC2008 полностью статической. Что бы не было ни одной MS DLL. На данный момент есть зависимости msvcst81.dll и еще какой то рантам пакетик юзеру ставить нужно.

PS: да проблема обсуждалась тут, но как сделать полную статическую версию я не нашел.


Название: Re: QT4.4 full static + VC2008 - это утопия?
Отправлено: Spicos от Ноябрь 07, 2008, 11:01
да вроде можно.
ключик в qmake.conf помойму надо поменять
с
QMAKE_CFLAGS_RELEASE   = -O2 -MD
на
QMAKE_CFLAGS_RELEASE   = -O2 -MТ


Название: Re: QT4.4 full static + VC2008 - это утопия?
Отправлено: Admin от Ноябрь 07, 2008, 12:02
нада будет попробовать


Название: Re: QT4.4 full static + VC2008 - это утопия?
Отправлено: Sergey B. от Ноябрь 07, 2008, 12:25
http://wiki.qtcentre.org/index.php?title=Building_static_Qt_on_Windows_with_MSVC (http://wiki.qtcentre.org/index.php?title=Building_static_Qt_on_Windows_with_MSVC)


Название: Re: QT4.4 full static + VC2008 - это утопия?
Отправлено: Admin от Ноябрь 07, 2008, 14:47
начал пробовать - доложу
а не нашел ту ссылку потому что искал для 2008 :)


Название: Re: QT4.4 full static + VC2008 - это утопия?
Отправлено: Detonator от Ноябрь 07, 2008, 14:48
У кого нибудь получилось?
Я пару недель назад пробовал, сама Qt для статики скомпилилась (-MТd). А вот когда я ее линкую с основной программой (тоже -MТd) куча runtime функций для QtCored.lib и QtGuid.lib не находятся.

Если кому удалось, объясните пожалуйста полный процесс как что делать.


Название: Re: QT4.4 full static + VC2008 - это утопия?
Отправлено: Detonator от Ноябрь 07, 2008, 18:05
Сегодня еще раз попробовал (все компилил и через -MT, и через -MTd), Qt компилится нормально, но конечное приложение не линкуется:
То же самое с динамической - все нормально.
В чем может быть проблема?

Код:
2>Linking...
2>dtypeengine.obj : error LNK2001: unresolved external symbol "public: static struct QVectorData QVectorData::shared_null" (?shared_null@QVectorData@@2U1@A)
2>dtypeengine.obj : error LNK2001: unresolved external symbol "public: static struct QListData::Data QListData::shared_null" (?shared_null@QListData@@2UData@1@A)
2>formattedtext.obj : error LNK2001: unresolved external symbol "public: static struct QListData::Data QListData::shared_null" (?shared_null@QListData@@2UData@1@A)
2>gamescriptengine.obj : error LNK2001: unresolved external symbol "public: static struct QListData::Data QListData::shared_null" (?shared_null@QListData@@2UData@1@A)
2>dtypeengine.obj : error LNK2001: unresolved external symbol "public: static struct QHashData QHashData::shared_null" (?shared_null@QHashData@@2U1@A)
2>gamemodule.obj : error LNK2001: unresolved external symbol "public: static struct QHashData QHashData::shared_null" (?shared_null@QHashData@@2U1@A)
2>gamescriptengine.obj : error LNK2001: unresolved external symbol "public: static struct QHashData QHashData::shared_null" (?shared_null@QHashData@@2U1@A)
2>scenescriptengine.obj : error LNK2001: unresolved external symbol "public: static struct QHashData QHashData::shared_null" (?shared_null@QHashData@@2U1@A)
2>dtypeengine.obj : error LNK2001: unresolved external symbol "private: static struct QByteArray::Data QByteArray::shared_null" (?shared_null@QByteArray@@0UData@1@A)
2>gamemodule.obj : error LNK2001: unresolved external symbol "private: static struct QByteArray::Data QByteArray::shared_null" (?shared_null@QByteArray@@0UData@1@A)
2>qtmaind.lib(qtmain_win.obj) : error LNK2001: unresolved external symbol "private: static struct QByteArray::Data QByteArray::shared_null" (?shared_null@QByteArray@@0UData@1@A)
2>scenescriptengine.obj : error LNK2001: unresolved external symbol "private: static struct QString::Data QString::shared_null" (?shared_null@QString@@0UData@1@A)
2>text.obj : error LNK2001: unresolved external symbol "private: static struct QString::Data QString::shared_null" (?shared_null@QString@@0UData@1@A)
2>formattedtext.obj : error LNK2001: unresolved external symbol "private: static struct QString::Data QString::shared_null" (?shared_null@QString@@0UData@1@A)
2>frame.obj : error LNK2001: unresolved external symbol "private: static struct QString::Data QString::shared_null" (?shared_null@QString@@0UData@1@A)
2>gamemodule.obj : error LNK2001: unresolved external symbol "private: static struct QString::Data QString::shared_null" (?shared_null@QString@@0UData@1@A)
2>gamescriptengine.obj : error LNK2001: unresolved external symbol "private: static struct QString::Data QString::shared_null" (?shared_null@QString@@0UData@1@A)
2>formattedtext.obj : error LNK2001: unresolved external symbol "private: static class QTextCodec * QString::codecForCStrings" (?codecForCStrings@QString@@0PAVQTextCodec@@A)
2>gamemodule.obj : error LNK2001: unresolved external symbol "private: static class QTextCodec * QString::codecForCStrings" (?codecForCStrings@QString@@0PAVQTextCodec@@A)
2>moc_frame.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const QGraphicsWidget::staticMetaObject" (?staticMetaObject@QGraphicsWidget@@2UQMetaObject@@B)
2>moc_text.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const QGraphicsWidget::staticMetaObject" (?staticMetaObject@QGraphicsWidget@@2UQMetaObject@@B)
2>moc_view.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const QObject::staticMetaObject" (?staticMetaObject@QObject@@2UQMetaObject@@B)
2>moc_gamemodule.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const QObject::staticMetaObject" (?staticMetaObject@QObject@@2UQMetaObject@@B)
2>moc_gamestate.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const QObject::staticMetaObject" (?staticMetaObject@QObject@@2UQMetaObject@@B)
2>moc_gridlayout.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const QObject::staticMetaObject" (?staticMetaObject@QObject@@2UQMetaObject@@B)
2>moc_stateobject.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const QObject::staticMetaObject" (?staticMetaObject@QObject@@2UQMetaObject@@B)
2>moc_gamescriptengine.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const QScriptEngine::staticMetaObject" (?staticMetaObject@QScriptEngine@@2UQMetaObject@@B)
2>moc_scenescriptengine.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const QScriptEngine::staticMetaObject" (?staticMetaObject@QScriptEngine@@2UQMetaObject@@B)
2>moc_mainwindow.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const QMainWindow::staticMetaObject" (?staticMetaObject@QMainWindow@@2UQMetaObject@@B)
2>moc_scene.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const QGraphicsScene::staticMetaObject" (?staticMetaObject@QGraphicsScene@@2UQMetaObject@@B)
2>moc_sceneview.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const QGraphicsView::staticMetaObject" (?staticMetaObject@QGraphicsView@@2UQMetaObject@@B)
2>moc_textbrowser.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const QGraphicsProxyWidget::staticMetaObject" (?staticMetaObject@QGraphicsProxyWidget@@2UQMetaObject@@B)
2>qtmaind.lib(qtmain_win.obj) : error LNK2001: unresolved external symbol "public: static enum QSysInfo::WinVersion const QSysInfo::WindowsVersion" (?WindowsVersion@QSysInfo@@2W4WinVersion@1@B)


Название: Re: QT4.4 full static + VC2008 - это утопия?
Отправлено: Admin от Ноябрь 08, 2008, 01:20
мой эксперимент не дошел до конца

был установленный MS VC 2008
захотел еще доставить MSDN
MSDN откатил инсталяцию VC2008

короче оставил собиратся - щас еще дома попробую))


Название: Re: QT4.4 full static + VC2008 - это утопия?
Отправлено: Admin от Ноябрь 08, 2008, 09:39
Так - эксперимент удался.
Была взята Qt4.4.3, в mkspecs/win32-msvc2008/qmake.conf заменил
с
QMAKE_CFLAGS_RELEASE   = -O2 -MD
на
QMAKE_CFLAGS_RELEASE   = -O2 -MТ

и у CONFIG удалил опции embeded_dll embeded_exe

собрал QT
собрал QWT
собрал программу свою

получил вместо 6100K размера 6280K ( но пока проверит негде( )

PS: главное пересобрать ВСЕ библиотеки ( nmake clean & qmake & nmake)


Название: Re: QT4.4 full static + VC2008 - это утопия?
Отправлено: Detonator от Ноябрь 08, 2008, 15:12
Перекомпилил Qt еще раз, сделал изменения как у тебя в посте выше.
Вот такой bat файл
Код:
cd C:\Qt\4.4.3
call C:\Qt\4.4.3\bin\qtvars.bat vsvars
configure -static -debug-and-release -no-fast -exceptions -accessibility -stl -no-sql-sqlite -no-qt3support -no-opengl -qt-zlib -qt-gif -qt-libpng -qt-libmng -no-libtiff -qt-libjpeg
nmake

При линковке в конечное приложение все равно ошибки:
Что я не так сделал?

Код:
QtGuid.lib(qaccessible_win.obj) : error LNK2019: unresolved external symbol __imp__PlaySoundA@12 referenced in function "public: static void __cdecl QAccessible::updateAccessibility(class QObject *,int,enum QAccessible::Event)" (?updateAccessibility@QAccessible@@SAXPAVQObject@@HW4Event@1@@Z)
2>QtGuid.lib(qaccessible_win.obj) : error LNK2019: unresolved external symbol __imp__PlaySoundW@12 referenced in function "public: static void __cdecl QAccessible::updateAccessibility(class QObject *,int,enum QAccessible::Event)" (?updateAccessibility@QAccessible@@SAXPAVQObject@@HW4Event@1@@Z)
2>QtGuid.lib(qwininputcontext_win.obj) : error LNK2019: unresolved external symbol _ImmSetCandidateWindow@8 referenced in function "public: virtual void __thiscall QWinInputContext::update(void)" (?update@QWinInputContext@@UAEXXZ)
2>QtGuid.lib(qwininputcontext_win.obj) : error LNK2019: unresolved external symbol _ImmSetCompositionWindow@8 referenced in function "public: virtual void __thiscall QWinInputContext::update(void)" (?update@QWinInputContext@@UAEXXZ)
2>QtGuid.lib(qwininputcontext_win.obj) : error LNK2019: unresolved external symbol _ImmSetCompositionFontA@8 referenced in function "public: virtual void __thiscall QWinInputContext::update(void)" (?update@QWinInputContext@@UAEXXZ)
2>QtGuid.lib(qwininputcontext_win.obj) : error LNK2019: unresolved external symbol _ImmSetCompositionFontW@8 referenced in function "public: virtual void __thiscall QWinInputContext::update(void)" (?update@QWinInputContext@@UAEXXZ)
2>QtGuid.lib(qwininputcontext_win.obj) : error LNK2019: unresolved external symbol _ImmGetContext@4 referenced in function "struct HIMC__ * __cdecl getContext(struct HWND__ *)" (?getContext@@YAPAUHIMC__@@PAUHWND__@@@Z)
2>QtGuid.lib(qwininputcontext_win.obj) : error LNK2019: unresolved external symbol _ImmReleaseContext@8 referenced in function "void __cdecl releaseContext(struct HWND__ *,struct HIMC__ *)" (?releaseContext@@YAXPAUHWND__@@PAUHIMC__@@@Z)
2>QtGuid.lib(qwininputcontext_win.obj) : error LNK2019: unresolved external symbol _ImmNotifyIME@16 referenced in function "void __cdecl notifyIME(struct HIMC__ *,unsigned long,unsigned long,unsigned long)" (?notifyIME@@YAXPAUHIMC__@@KKK@Z)
2>QtGuid.lib(qwininputcontext_win.obj) : error LNK2019: unresolved external symbol _ImmGetCompositionStringA@16 referenced in function "long __cdecl getCompositionString(struct HIMC__ *,unsigned long,void *,unsigned long,bool *)" (?getCompositionString@@YAJPAUHIMC__@@KPAXKPA_N@Z)
2>QtGuid.lib(qwininputcontext_win.obj) : error LNK2019: unresolved external symbol _ImmGetCompositionStringW@16 referenced in function "long __cdecl getCompositionString(struct HIMC__ *,unsigned long,void *,unsigned long,bool *)" (?getCompositionString@@YAJPAUHIMC__@@KPAXKPA_N@Z)


Название: Re: QT4.4 full static + VC2008 - это утопия?
Отправлено: Admin от Ноябрь 08, 2008, 16:07
у тебя в проект должна включаться либа
winmm.lib или imp32.lib
точно не помню MSDN дома нет
глянь в нем, в каком файле PlaySound определна


Название: Re: QT4.4 full static + VC2008 - это утопия?
Отправлено: Detonator от Ноябрь 08, 2008, 19:54
Добавил Imm32.lib, все скомпилилось и заработало, ура!
Что то я ступил, грешил на саму Qt.
Размер exe меньше чем все dll по отдельности, а ведь потом еще и сжать upx-м или подобным можно.
Так что вариант со статической линковкой теперь для меня идеальный.


Название: Re: QT4.4 full static + VC2008 - это утопия?
Отправлено: Admin от Ноябрь 08, 2008, 22:26
А ты не пробовал на чистом компьютере? Просит ли что нить еще? Чистого компа нет под рукой :( 8)


Название: Re: QT4.4 full static + VC2008 - это утопия?
Отправлено: Detonator от Ноябрь 08, 2008, 22:48
Нет, под рукой тоже ничего нет. Интересно будет попробовать под Win98/2000 на всякий случай, под виртуалкой позже попробую.


Название: Re: QT4.4 full static + VC2008 - это утопия?
Отправлено: Spicos от Ноябрь 10, 2008, 06:21
И это радует, что заработало.


Название: Re: QT4.4 full static + VC2008 - это утопия?
Отправлено: mks56 от Ноябрь 10, 2008, 09:52
По-моему, должно требовать что-то подобное msvcrXX.dll. Или кому-нибудь удалось это победить?


Название: Re: QT4.4 full static + VC2008 - это утопия?
Отправлено: ритт от Ноябрь 10, 2008, 10:32
перечитай тему


Название: Re: QT4.4 full static + VC2008 - это утопия?
Отправлено: Detonator от Ноябрь 11, 2008, 23:21
По-моему, должно требовать что-то подобное msvcrXX.dll. Или кому-нибудь удалось это победить?

У меня скомпилилось все в статике, для запуска требует только стандартные виндовые dll:
WSOCK32.dll
IMM32.dll
WINMM.dll
KERNEL32.dll
USER32.dll
GDI32.dll
ADVAPI32.dll
SHELL32.dll
ole32.dll
OLEAUT32.dll


Название: Re: QT4.4 full static + VC2008 - это утопия?
Отправлено: spirit от Ноябрь 12, 2008, 09:38
выложите мануал на вики, имхо будет полезно.  :)


Название: Re: QT4.4 full static + VC2008 - это утопия?
Отправлено: remiznik от Февраль 19, 2009, 21:35
сделал как тут написано вроде всё прошло успешно только теперь не могу собрать свой проект выдаёт ошибку
Код:
QtCored4.lib(QtCored4.dll) : error LNK2005: "public: __thiscall QString::~QString(void)" (??1QString@@QAE@XZ) уже определен в test.obj
QtCored4.lib(QtCored4.dll) : error LNK2005: "public: bool __thiscall QBasicAtomicInt::deref(void)" (?deref@QBasicAtomicInt@@QAE_NXZ) уже определен в test.obj
msvcrtd.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) уже определен в LIBCMT.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) уже определен в LIBCMT.lib(typinfo.obj)
LIBCMT.lib(crt0init.obj) : warning LNK4098: библиотека по умолчанию "msvcrtd.lib" противоречит использованию других библиотек; используйте параметр /NODEFAULTLIB:library
test.obj : error LNK2001: неразрешенный внешний символ ""private: static struct QString::Data QString::shared_null" (?shared_null@QString@@0UData@1@A)"
moc_test.obj : error LNK2001: неразрешенный внешний символ ""public: static struct QMetaObject const QDialog::staticMetaObject" (?staticMetaObject@QDialog@@2UQMetaObject@@B)"

может кто сталкивался ? подскажит как с этим бороться ?


Название: Re: QT4.4 full static + VC2008 - это утопия?
Отправлено: mks56 от Февраль 20, 2009, 13:40
1. Собирать проект нужно с ключом MT(d) вместо MD(d)
2. Имена статических библиотек qt также отличаются (4 - отсутствуют)
3. Библиотеки run-time для сборки примерно такие: gdi32.lib comdlg32.lib oleaut32.lib imm32.lib winmm.lib winspool.lib ws2_32.lib ole32.lib user32.lib msimg32.lib shell32.lib kernel32.lib uuid.lib advapi32.lib qtmaind.lib QtCored.lib QtGuid.lib Qt3Supportd.lib QtNetworkd.lib