Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: Tertium Organum от Апрель 05, 2007, 15:17



Название: 4.2.3 статически со стат. MSVCRT из сырцов с нуля
Отправлено: Tertium Organum от Апрель 05, 2007, 15:17
Надеюсь, это не выглядит как спам. Просто только недавно я делал топик по 4.2.0. Но там было несколько криво. Не ручаюсь, что здесь все наилучшим способом делается, но это работает, и на это ушло вобщем два дня.
Итак:

0. слили с того-что-нельзя-называть-дабы-не-упоминать-о-неупоминаемом-имя-которого-мы-не-произносим-вслух qt-win-commercial-src-4.2.3.zip

1. скопировали исходники в c:\qt\4.2.3

2. Создали файл .qt-license в Documents and Settings\<user name>\

3. Вписали в него:
# Qt license file (Created by the binary installer)
LicenseID="XXXXXXXXX"
Licensee="<user name>"
LicenseKeyExt=XXXXXXX-XXXXXXX-XXX-XXXXXXX-XXXXXX-XXXXXX-XXXX

генератор найти не составит труда

4.Находим C:\Qt\4.2.3\mkspecs\win32-msvc2005\qmake.conf. Правим в нем, чтобы линковать к кутешным либам MSVCRT статически:

QMAKE_CFLAGS_RELEASE   = -O2 -MD
QMAKE_CFLAGS_DEBUG   = -Zi -MDd
      
на

QMAKE_CFLAGS_RELEASE   = -O2 -MT
QMAKE_CFLAGS_DEBUG   = -Zi -MTd

Находим строку типа «CONFIG   += qt warn_on release...» и убираем в ее конце директивы embed_manifest_dll и embed_manifest_exe


5. C:\Qt\4.2.3\projects.pro комментарим строку:
  # SUBDIRS += demos examples

6. Запускаем Пуск –> Microsoft Visual Studio 2005 ->Visual Studio Tools ->Visual Studio 2005 Command Prompt и пишем в ней:
cd c:\qt\4.2.3
configure -debug-and-release -static -qt-libjpeg -qt-zlib -qt-gif -no-qt3support
ждем, пока не напишет что теперь можно пускать nmake. Однако не nmake пускаем пока.

7. Заходим в папку C:\Qt\4.2.3\src\, открываем в студии src.sln. Выделяем все проекты с шифтом, заходим в
Properties -> C/C++ -> Output files -> Program database file name
Задаем строку: $(TargetDir)$(TargetName).pdb
Теперь, если нужны будут pdb файлы (чтобы можно было в отладке свободно ходить), надо будет в студии сделать нужным
либам Rebuild Selected. По месту создадутся одноименные либам pdbшники, а не как по дефолту vc8.
Целиком собирать в студии я не стал, проще было воспользоваться nmake.

8. Компилим moc, rcc, uic. Без них сборка nmake'ом невозможна. В c:\qt\4.2.3\bin должны появиться соотв. экзешники.
Студию не закрываем.

9. Если нужно не все, а только сама QT и тулзы, делаем простой батничек в c:\qt\4.2.3\, например, mybuild.bat :
nmake sub-src
nmake sub-tools

10. В консоли мокрософта пишем:
mybuild.bat или просто nmake
Ждем окончания компиляции
nmake clean

11. Возвращаемся в студию, выделяем и билдим нужные нам библиотеки.
Я компилил qtmain, QtGui, QtCore, QtNetwork, QtOpenGL, QtSQL, QtXML.
Потом делаем в c:\qt\4.2.3\:
del /f /s /q *.obj
del /f /s /q *.ilk
del /f /s /q *.pch

12. Процесс завершен. Теперь надо ставить qt-vsintegration-1.2.2.exe, скопированный с  того-что-нельзя-называть-дабы-не-упоминать-о-неупоминаемом-имя-которого-мы-не-произносим-вслух.
 
Папка с QT в результате занимает у меня 516 метров.


Название: Re: 4.2.3 статически со стат. MSVCRT из сырцов с нуля
Отправлено: pastor от Апрель 05, 2007, 18:59
Дополню вышесказанное статьей: Building static Qt on Windows (http://wiki.qtcentre.org/index.php?title=Building_static_Qt_on_Windows)


Название: 4.2.3 статически со стат. MSVCRT из сырцов с нуля
Отправлено: aliks-os от Апрель 06, 2007, 12:38
Скиньте мне пожалуйста на мыло адрес
того-что-нельзя-называть-дабы-не-упоминать-о-неупоминаемом-имя-которого-мы-не-произносим-вслух.

добавлено спустя 2 часа 27 минут:

 А можно ли поставить и юзать все это на WinXP без установки VS.
А то у меня нет его, а при сборке использую компилятор от Борланда и выскакивают куча ошибок


Название: 4.2.3 статически со стат. MSVCRT из сырцов с нуля
Отправлено: noosooth от Апрель 06, 2007, 17:06
Чтобы не плодить топики напишу тут.

Я тут недавно переписывал драйвер для одной железяки под виндой.
Отладочную инфу от драйвера наблюдал в DebugView, а она до кучи перехватывала и OutputDebugString от win32 приложений.
Смешно конечно. Отлаживал драйвер, а увидел что выводит в debugger Qt'овое приложение.

Короче увидел я там, что моё поделие, собранное при помощи компилятора от VS2005 со static release Qt 4.2.3 + статически слинкованный runtime, сыпет при запуске и иногда в процессе работы qWarning'ами типа:

 
Цитировать
[2252] QObject::moveToThread: Current thread (01522428) is not the object's thread (00DA44A0).
[2252] Cannot move to target thread (00DA44A0)

Странно думаю, ведь сразу после запуска  поток в программе у меня один.

Полез собрал release /examples/mainwindows/mdi
Та же фигня при запуске.

На работе приложения оно вроде никак не сказывается.

Спрашивается что в данном случае не нравится QObject::moveToThread?
И кого он собственно move?

P.S. Что-то похожее проскакивало тут (http://lists.trolltech.com/qt-interest/2007-02/thread00694-0.html), но как-то невнятно.


Название: 4.2.3 статически со стат. MSVCRT из сырцов с нуля
Отправлено: ReAmimaFan от Апрель 10, 2007, 15:16
Сделал все как было написано в первом посте и при попытке откомпилировать проек получаю
cannot open input file 'c:\Qt\4.2.2\lib\QtGui4.lib'
Что я сделал не правильно подскажите плз.
З.Ы. поделитесь кто нибудь ключиком к 4.2.3


Название: 4.2.3 статически со стат. MSVCRT из сырцов с нуля
Отправлено: Tertium Organum от Апрель 12, 2007, 09:02
блин, QtGui4.lib - это статлиба для линковки dll!
надо грузить QtGui.lib или QtGuid.lib для отладочного проекта

проект, создаваемый интегратором хочет динамическую куте по умолчанию


ключик как и на все остальные продукты троллтека, здесь писать не дают, на личку кину


Название: 4.2.3 статически со стат. MSVCRT из сырцов с нуля
Отправлено: ReAnimaFan от Апрель 12, 2007, 12:30
Цитата: "Tertium Organum"

надо грузить QtGui.lib или QtGuid.lib для отладочного проекта
проект, создаваемый интегратором хочет динамическую куте по умолчанию

Не подскажете как сделать так чтобы он хотел статическую куте? Буду очень благодарен.


Название: 4.2.3 статически со стат. MSVCRT из сырцов с нуля
Отправлено: Tertium Organum от Апрель 14, 2007, 00:15
просто прописать в настройках линкера -> инпут вместо QtGui4.lib
QtGui.lib


Название: Re: 4.2.3 статически со стат. MSVCRT из сырцов с нуля
Отправлено: WW от Май 28, 2007, 12:50
Цитата: "Tertium Organum"

4.Находим C:\Qt\4.2.3\mkspecs\win32-msvc2005\qmake.conf. Правим в нем, чтобы линковать к кутешным либам MSVCRT статически:

QMAKE_CFLAGS_RELEASE   = -O2 -MD
QMAKE_CFLAGS_DEBUG   = -Zi -MDd
      
на

QMAKE_CFLAGS_RELEASE   = -O2 -MT
QMAKE_CFLAGS_DEBUG   = -Zi -MTd

Находим строку типа «CONFIG   += qt warn_on release...» и убираем в ее конце директивы embed_manifest_dll и embed_manifest_exe


А есть решение под MinGW. Чтобы "все свое ношу с собой". А то завязка на mingw32.dll остается...


Название: Re: 4.2.3 статически со стат. MSVCRT из сырцов с нуля
Отправлено: pastor от Май 28, 2007, 13:52
Цитата: "WW"

А есть решение под MinGW. Чтобы "все свое ношу с собой". А то завязка на mingw32.dll остается...


Читаем по ссылке во вотром посте этой темы


Название: 4.2.3 статически со стат. MSVCRT из сырцов с нуля
Отправлено: WW от Май 28, 2007, 14:20
:D  Пасиб! Слона-то и не приметил.


Название: Re: 4.2.3 статически со стат. MSVCRT из сырцов с нуля
Отправлено: Djavdet от Сентябрь 26, 2007, 11:28
для 4.3.1 версии QT схема  покатит?


Название: Re: 4.2.3 статически со стат. MSVCRT из сырцов с нуля
Отправлено: pastor от Сентябрь 26, 2007, 14:44
для 4.3.1 версии QT схема  покатит?

Да, должна


Название: Re: 4.2.3 статически со стат. MSVCRT из сырцов с нуля
Отправлено: 3epo4 от Сентябрь 27, 2007, 11:42
Сделал все по инструкции, в итогде такие ошибки линковки:
Цитировать
1>------ Build started: Project: screenshot, Configuration: Release Win32 ------
1>MOC screenshot.h
1>Compiling...
1>moc_screenshot.cpp
1>screenshot.cpp
1>main.cpp
1>Generating Code...
1>Linking...
1>MSVCRT.lib(MSVCR80.dll) : error LNK2005: _longjmp already defined in LIBCMT.lib(longjmp.obj)
1>MSVCRT.lib(MSVCR80.dll) : error LNK2005: _malloc already defined in LIBCMT.lib(malloc.obj)
1>MSVCRT.lib(MSVCR80.dll) : error LNK2005: _fprintf already defined in LIBCMT.lib(fprintf.obj)
1>MSVCRT.lib(MSVCR80.dll) : error LNK2005: ___iob_func already defined in LIBCMT.lib(_file.obj)
1>MSVCRT.lib(MSVCR80.dll) : error LNK2005: _free already defined in LIBCMT.lib(free.obj)
1>MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) already defined in LIBCMT.lib(typinfo.obj)
1>MSVCRT.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 LIBCMT.lib(typinfo.obj)
1>LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>release\screenshot.exe : fatal error LNK1169: one or more multiply defined symbols found
1>screenshot - 8 error(s), 1 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========


Название: Re: 4.2.3 статически со стат. MSVCRT из сырцов с нуля
Отправлено: pastor от Сентябрь 27, 2007, 12:57
Сделал все по инструкции, в итогде такие ошибки линковки

Очисть проект, перегенери мейк-файл или файл студийного проекта и попробуй собрать заново


Название: Re: 4.2.3 статически со стат. MSVCRT из сырцов с нуля
Отправлено: WW от Сентябрь 27, 2007, 13:11
Эти ошибки сыпят тогда, когда Qt либы собраны по инструкции выше, а в опциях проекта - рантайм dll. Поправь проект и все соберется.


Название: Re: 4.2.3 статически со стат. MSVCRT из сырцов с нуля
Отправлено: 3epo4 от Сентябрь 27, 2007, 14:01
Эти ошибки сыпят тогда, когда Qt либы собраны по инструкции выше, а в опциях проекта - рантайм dll. Поправь проект и все соберется.

В опции Runtime Library стоит Multi-threaded (/MT) или я что-то путаю?


Название: Re: 4.2.3 статически со стат. MSVCRT из сырцов с нуля
Отправлено: pastor от Сентябрь 27, 2007, 15:08
В опции Runtime Library стоит Multi-threaded (/MT) или я что-то путаю?

Все верно. А что за приложение вы пытаетесь собрать? Экзампл или свое? Попробуйте всеже

nmake clean
qmake
nmake


Название: Re: 4.2.3 статически со стат. MSVCRT из сырцов с нуля
Отправлено: 3epo4 от Сентябрь 27, 2007, 16:20

Все верно. А что за приложение вы пытаетесь собрать? Экзампл или свое? Попробуйте всеже

nmake clean
qmake
nmake


Попробовал, не работает, теже самые ошибки линкера. Собирал примеры Qt.


Название: Re: 4.2.3 статически со стат. MSVCRT из сырцов с нуля
Отправлено: Hellraiser от Сентябрь 27, 2007, 17:07
Вот что дал поиск в MSDN по предупреждению линкера LNK4098:
Код:
To use this run-time library ignore these libraries:
Single-threaded (libc.lib) - libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib
Multithreaded (libcmt.lib) - libc.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib
Multithreaded using DLL (msvcrt.lib) - libc.lib, libcmt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib
Debug Single-threaded (libcd.lib) - libc.lib, libcmt.lib, msvcrt.lib, libcmtd.lib, msvcrtd.lib
Debug Multithreaded (libcmtd.lib) - libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, msvcrtd.lib
Debug Multithreaded using DLL (msvcrtd.lib) - libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib

For example, if you received this warning and you want to create an executable file that uses the non-debug, single-threaded version of the run-time libraries, you could use the following options with the linker:

/NODEFAULTLIB:libcmt.lib /NODEFAULTLIB:msvcrt.lib /NODEFAULTLIB:libcd.lib /NODEFAULTLIB:libcmtd.lib /NODEFAULTLIB:msvcrtd.lib


И это действительно так. По умолчанию заточка идет под проект с поддержкой DLL. Для статической сборки надо явно указать директивы линкера. А Qt здесь не причем.


Название: Re: 4.2.3 статически со стат. MSVCRT из сырцов с нуля
Отправлено: 3epo4 от Сентябрь 28, 2007, 06:05
Вот что дал поиск в MSDN по предупреждению линкера LNK4098:
Код:
To use this run-time library ignore these libraries:
Single-threaded (libc.lib) - libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib
Multithreaded (libcmt.lib) - libc.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib
Multithreaded using DLL (msvcrt.lib) - libc.lib, libcmt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib
Debug Single-threaded (libcd.lib) - libc.lib, libcmt.lib, msvcrt.lib, libcmtd.lib, msvcrtd.lib
Debug Multithreaded (libcmtd.lib) - libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, msvcrtd.lib
Debug Multithreaded using DLL (msvcrtd.lib) - libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib

For example, if you received this warning and you want to create an executable file that uses the non-debug, single-threaded version of the run-time libraries, you could use the following options with the linker:

/NODEFAULTLIB:libcmt.lib /NODEFAULTLIB:msvcrt.lib /NODEFAULTLIB:libcd.lib /NODEFAULTLIB:libcmtd.lib /NODEFAULTLIB:msvcrtd.lib


И это действительно так. По умолчанию заточка идет под проект с поддержкой DLL. Для статической сборки надо явно указать директивы линкера. А Qt здесь не причем.

Спасибо, примеры теперь собираются, но Assistant не хочет, пишет:
Цитировать
main.obj : error LNK2019: unresolved external symbol "class QObject * __cdecl qt_plugin_instance_qjpeg(void)"
(?qt_plugin_instance_qjpeg@@YAPAVQObject@@XZ) referenced in function "public: __thiscall StaticqjpegPluginInstance::StaticqjpegPluginInstance(void)" (??0StaticqjpegPluginInstance@@QAE@XZ)
..\..\bin\assistant.exe : fatal error LNK1120: 1 unresolved externals


Название: Re: 4.2.3 статически со стат. MSVCRT из сырцов с нуля
Отправлено: Hellraiser от Сентябрь 28, 2007, 16:26
Ассистент хочет JPEG-плагин, идем в src/plugins/imageformats/jpeg и делаем последовательно qmake и nmake.


Название: Re: 4.2.3 статически со стат. MSVCRT из сырцов с нуля
Отправлено: 3epo4 от Сентябрь 28, 2007, 18:15
Ассистент хочет JPEG-плагин, идем в src/plugins/imageformats/jpeg и делаем последовательно qmake и nmake.

JPEG-плагин ставится нормально, но компиляция Ассистента не выходит.


Название: Re: 4.2.3 статически со стат. MSVCRT из сырцов с нуля
Отправлено: pastor от Сентябрь 28, 2007, 19:48
2 3epo4: Попробуйте зделать так:

Удалить имеющеюся сборку и начать заново. В <QTDIR>\mkspecs\win32-X\qmake.conf заменить

QMAKE_CFLAGS_RELEASE   = -O2 -MD
QMAKE_CFLAGS_DEBUG   = -Zi -MDd
     
на

QMAKE_CFLAGS_RELEASE   = -O2 -MT
QMAKE_CFLAGS_DEBUG   = -Zi -MTd

Далее просто сконфигурировать Qt как статическую:

configure -static .....

Я делал именно так, никаких проблем.


Название: Re: 4.2.3 статически со стат. MSVCRT из сырцов с нуля
Отправлено: 3epo4 от Сентябрь 29, 2007, 04:37
2 3epo4: Попробуйте зделать так:

Удалить имеющеюся сборку и начать заново. В <QTDIR>\mkspecs\win32-X\qmake.conf заменить

QMAKE_CFLAGS_RELEASE   = -O2 -MD
QMAKE_CFLAGS_DEBUG   = -Zi -MDd
     
на

QMAKE_CFLAGS_RELEASE   = -O2 -MT
QMAKE_CFLAGS_DEBUG   = -Zi -MTd

Далее просто сконфигурировать Qt как статическую:

configure -static .....

Я делал именно так, никаких проблем.

Понятно. А дерективы embed_manifest_dll и embed_manifest_exe из CONFIG разве не надо убирать?

Не в этом ли проблема "WARNING: Using static linking will disable the use of plugins. Make sure you compile ALL needed modules into the library." ?


Название: Re: 4.2.3 статически со стат. MSVCRT из сырцов с нуля
Отправлено: 3epo4 от Сентябрь 29, 2007, 05:44
Переустановил Qt с исправленным qmake.conf, теперь всё ок.


Название: Re: 4.2.3 статически со стат. MSVCRT из сырцов с нуля
Отправлено: pastor от Сентябрь 29, 2007, 10:41
Понятно. А дерективы embed_manifest_dll и embed_manifest_exe из CONFIG разве не надо убирать?

Не в этом ли проблема "WARNING: Using static linking will disable the use of plugins. Make sure you compile ALL needed modules into the library." ?

Если есть немного времени, вы можите добавить остальные флаги в qmake.conf и попробывать собрать Qt. имхо, проблема не в них, а где-то в пунктах начиная с 5