среда, 4 июля 2012 г.

Компиляция примеров POCO в QT Creator + MinGW

Для начала возьмем самое простое -- скомпилируем под  QT Creator+MinGW примеры POCO
(http://pocoproject.org/download/index.html)

Basic Edition
No external dependencies — start developing immediately


poco-1.4.3p1.zip │4176 K


содержит в себе следующие компоненты


║..                                    │readme
║build                                 │version
║contrib                               │
CppUnit                               │
║doc                                   │
Foundation                            │
Net                                   │
║patches                               │
Util                                  │
XML                                   │
║build_CE_vs90.cmd                     │
║build_vcexpress2008.cmd               │
║build_vcexpress2010.cmd               │
║build_vs100.cmd                       │
║build_vs71.cmd                        │
║build_vs80.cmd                        │
║build_vs90.cmd                        │
║buildvms.com                          │
║buildwin.cmd                          │
║changelog                             │
║components                            │
║configure                             │
║contributors                          │
║DLLVersion.rc                         │
║libversion                            │
║license                               │
║Makefile                              │
║manifest                              │
║news                                  │



Professional Edition
Includes additional powerful libraries and tools
Платный, поэтому по определению не интересует


Нас же интересует

Complete Edition
Requires OpenSSL, MySQL Client and ODBC


poco-1.4.3p1-all.zip │7003 K

..                       │libversion
build                    │license
contrib                  │Makefile
CppUnit                  │manifest
Crypto                   │news
Data                     │readme
doc                      │version
Foundation               │
Net                      │
NetSSL_OpenSSL           │
PageCompiler             │
patches                  │
Util                     │
XML                      │
Zip                      │
build_CE_vs90         cmd│
build_vcexpress2008   cmd│
build_vcexpress2010   cmd│
build_vs100           cmd│
build_vs71            cmd│
build_vs80            cmd│
build_vs90            cmd│
buildvms              com│
buildwin              cmd│
changelog                │
components               │
configure                │
contributors             │
DLLVersion            rc │

ГРАБЛИ №1


Как видем из списка файлов дистрибьютив не заточен под компиляцию в  QT Creator+MinGW.
Что же делать? Писать проекты/makefile в ручную?

Обратимся к мировому разуму:
http://gluescript.sourceforge.net/?q=node/22

Похожую проблему народ поборол используя Premake4 (http://industriousone.com/premake/download) и скрипт на lua (http://gluescript.svn.sourceforge.net/viewvc/gluescript/trunk/src/poco.zip?view=log)

Но проблему побороли не до конца и не на той версии POCO и как следствие скрипты оказались не совсем корректными.
Пришлось с бубном и матом, методом проб и ошибок писать свои скрипты: 
http://www.dymovoy.ru/download/premake4_lua_poco-1.4.3p1-all.rar


Потребуется:
http://sourceforge.net/projects/premake/files/Premake/4.3/premake-4.3-windows.zip/download
premake-4.3-windows.zip   │ 90861

в котором лежит
premake4.exe              │261632

и собственно сами новые скрипты lua http://www.dymovoy.ru/download/premake4_lua_poco-1.4.3p1-all.rar

кладем скрипты по директориям а дальше в корневой директории POCO запускаем
C:\premake4\premake4.exe gmake


В результате будут созданы файлы Makefile, которые и будут использоваться для начальной компиляции библиотеки.



ГРАБЛИ №2

Обратите внимание, что стоит в файлах lua
             "WINVER=0x0501",
Это означает что версия ОС у нас не ниже Windows XP.
Это реальный баг MinGW: по умолчанию переменная WINVER=0x0500 и как следствие Windows2000, а MinGW не умеет корректно работать со стеком в Windows2000.

Поэтому компиляцию нужно проводить из батника !build_mingw.bat

@echo off



setlocal

set OPENSSL_DIR=c:\openssl
set OPENSSL_INCLUDE=%OPENSSL_DIR%\include
set OPENSSL_LIB=%OPENSSL_DIR%\lib
set INCLUDE=%INCLUDE%;%OPENSSL_INCLUDE%
set LIB=%LIB%;%OPENSSL_LIB%

set POCO_BASE=%CD%
set PATH=D:\QtSDK\mingw\bin\;%POCO_BASE%\bin;%PATH%

set PLATFORM=Win32


set POCO_OS_FAMILY_WINDOWS=1
set Win32=0x0501
set MINGW32=0x0501
set POCO_VXWORKS=
set _WIN32_WINNT=0x0501


C:\premake4\premake4.exe gmake

mingw32-make.exe config=release
mingw32-make.exe

endlocal

в результате в директории ...\poco\lib\ должны появиться откомпилированные файлы *.a, которые я руками переименовал в *.lib (я это понял уже потом что нужно переименовать -- QT Creator не хотел их добавлять в проект)
libPoco_CppUnit_mt                          lib│216938
libPoco_CppUnit_mtd                         lib│216938
libPoco_Crypto_mt                           lib│382736
libPoco_Crypto_mtd                          lib│389834
libPoco_Data_mt                             lib│1360 K
libPoco_Data_mtd                            lib│1379 K
libPoco_Foundation_mt                       lib│4320 K
libPoco_Foundation_mtd                      lib│4411 K
libPoco_Net_mt                              lib│2791 K
libPoco_Net_mtd                             lib│2841 K
libPoco_NetSSL_mt                           lib│ 984 K
libPoco_NetSSL_mtd                          lib│1000 K
libPoco_PageCompiler_mt                     lib│151998
libPoco_PageCompiler_mtd                    lib│154900
libPoco_Util_mt                             lib│1537 K
libPoco_Util_mtd                            lib│1556 K
libPoco_XML_mt                              lib│1492 K
libPoco_XML_mtd                             lib│1531 K
libPoco_Zip_mt                              lib│1232 K
libPoco_Zip_mtd                             lib│1249 K





ГРАБЛИ №3


Компиляция самого примера это тоже не для слабонервных
Открываем в самом интерфейсе QT Creator файл проекта *.pro и добавляем библиотеки *.lib/*.a (правой кнопкой мышки) (помечено оранжевым цветом) и руками переменные (помечено синим цветом), затем дошкуриваем руками. Обратите внимание, что руками добавляются библиотеки POCO, WinSocket'а и библиотеки openssl. Как это сделать автоматом я так и не смог понять.





#-------------------------------------------------
#
# Project created by QtCreator 2012-07-03T16:48:27
#
#-------------------------------------------------


QT       += core


QT       -= gui


TARGET = sslprj02
CONFIG   += console
CONFIG   -= app_bundle


TEMPLATE = app


SOURCES += main.cpp


WINVER = 0x0501
_WIN32_WINNT = 0x0501


#-------------------------------------------------
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../poco/lib/ -llibPoco_NetSSL_mt
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../poco/lib/ -llibPoco_NetSSL_mtd


INCLUDEPATH += $$PWD/../poco/NetSSL_OpenSSL/include/
DEPENDPATH += $$PWD/../poco/NetSSL_OpenSSL/include/
#-------------------------------------------------




#-------------------------------------------------
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../poco/lib/ -llibPoco_Crypto_mt
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../poco/lib/ -llibPoco_Crypto_mtd


INCLUDEPATH += $$PWD/../poco/Crypto/include/
DEPENDPATH += $$PWD/../poco/Crypto/include/
#-------------------------------------------------


#-------------------------------------------------
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../poco/lib/ -llibPoco_Net_mt
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../poco/lib/ -llibPoco_Net_mtd


INCLUDEPATH += $$PWD/../poco/Net/include/
DEPENDPATH += $$PWD/../poco/Net/include/
#-------------------------------------------------


#-------------------------------------------------
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../poco/lib/ -llibPoco_Util_mt
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../poco/lib/ -llibPoco_Util_mtd


INCLUDEPATH += $$PWD/../poco/Util/include/
DEPENDPATH += $$PWD/../poco/Util/include/
#-------------------------------------------------




#-------------------------------------------------
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../poco/lib/ -llibPoco_XML_mt
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../poco/lib/ -llibPoco_XML_mtd


INCLUDEPATH += $$PWD/../poco/XML/include/
DEPENDPATH += $$PWD/../poco/XML/include/
#-------------------------------------------------




#-------------------------------------------------
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../poco/lib/ -llibPoco_Foundation_mt
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../poco/lib/ -llibPoco_Foundation_mtd


INCLUDEPATH += $$PWD/../poco/Foundation/include/
DEPENDPATH += $$PWD/../poco/Foundation/include/
#-------------------------------------------------


win32: LIBS += -LC:/openssl/lib/ -lssleay32
win32: LIBS += -LC:/openssl/lib/ -llibeay32


INCLUDEPATH += c:/openssl/include/
DEPENDPATH += c:/openssl/include/


win32: LIBS += -LD:/QtSDK/mingw/lib/ -lws2_32
win32: LIBS += -LD:/QtSDK/mingw/lib/ -liphlpapi


В файле *.cpp до #include вставляем строку

#define _WIN32_WINNT 0x0501
чтобы уж быть точно уверенным.

ГРАБЛИ №4

Перед запуском в отладке или просто так убедитесь, что у вас доступны DLL (прописана директория в переменной PATH или лежат в текущей директории) следующие файлы:

СКЗИ МагПро КриптоПакет он же openssl 0.9.8e
cryptoeay32-0.9.8.dll                        │1387 K


ssleay32-0.9.8.dll                           │330426
zlib1.dll                                    │ 73216





Основные куски библиотек MinGW

libgcc_s_dw2-1.dll                           │ 43008
mingwm10.dll                                 │ 11362


Основные библиотеки QT (большая часть не нужна, но на всякий случай положите в доступную папку)
phonon4.dll                                  │344576
QtCore4.dll                                  │2492 K
QtDeclarative4.dll                           │2995 K
QtGui4.dll                                   │9619 K
QtMultimedia4.dll                            │174080
QtNetwork4.dll                               │1181 K
QtOpenGL4.dll                                │912384
QtScript4.dll                                │2126 K
QtScriptTools4.dll                           │745984
QtSql4.dll                                   │271872
QtSvg4.dll                                   │373248
QtWebKit4.dll                                │  17 M
QtXml4.dll                                   │399360
QtXmlPatterns4.dll                           │3912 K



Обратите внимание, что при запуске откомпилированного в DEBUG режиме файла нужно чтобы были еще доступны соответствующие библиотеки с буковкой <d>.

Пример:
....
QtCored4.dll                                 │  30 M
QtGuid4.dll                                  │ 148 M
QtSvgd4.dll                                  │5475 K
QtNetworkd4.dll                              │  19 M
....


ГРАБЛИ №5

Под гостевой ОС Windows XP откомпилированный пример работает нормально, под основной ОС Windows 7 пример вываливается с ошибкой:
I/O error: Permission denied
Так что есть еще с чем бороться %)









1 комментарий: