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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Статический Qt в виндус dll  (Прочитано 3103 раз)
anaksimandr
Гость
« : Апрель 17, 2011, 19:27 »

Знаю, что подобных тем хватает, форум читал, гуглил, но все равно вынужден создать еще одну тему.

Создаю плагин для приложения, не использующего qt. Поскольку есть потребность в webkit - было решено использовать qt.

Собрал qt статически по мануалам так:
0. Скачал архив с исходниками qt 4.7.2
1. qt\mkspecs\win32-g++\qmake.conf привел к виду
QMAKE_LFLAGS = -static -static-libgcc -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc
2. Создал батник для запуска консоли с переменными qt
Код:
SET QTDIR=E:\Projects\qt
SET MINGWDIR=E:\Projects\qt\mingw
SET QMAKESPEC=win32-g++
 
SET PATH=%QTDIR%\bin;%MINGWDIR%\bin;%SystemRoot%\System32

cmd.exe
3. Сконфигурировал
configure -static -debug-and-release -qt-libpng -qt-libjpeg -no-exceptions -webkit

4. Собрал
mingw32-make sub-src

В QT Creater создаю проект, подсовываю ему шаблон плагинов для софтины, под которую пишу, .pro файл выглядит так

Код:
QT       += core gui

TARGET = QTTest


#CONFIG   += console
TEMPLATE = lib
CONFIG += shared dll

VERSION = 0.0.0.1
DEFINES += D_SHARED_LIB
DEFINES += UNICODE
SOURCES += main.cpp
HEADERS += \
    main.h \
    newpluginapi.h \
    m_skin.h \
    m_langpack.h \
    m_clist.h \
    statusmodes.h \
    m_plugins.h

Проект компилится и работает.

А вот когда я хочу заюзать qt - начинаются пробелмы.
Добавляю в одну из функций
 
Код:
QMessageBox::warning(NULL,"ACCESS","You have access QT");
и все, не компилится:

Код:
Выполняется сборка проекта QTTest...
Запускается "e:\projects\qt\bin\qmake.exe" E:\Projects\Sources\QTTest\QTTest.pro -r -spec win32-g++ CONFIG+=debug_and_release QMLJSDEBUGGER_PATH=G:/QTCreater/QtCreator/share/qtcreator/qml/qmljsdebugger
Процесс "e:\projects\qt\bin\qmake.exe" завершился нормально.
Запускается "E:\Projects\qt\mingw\bin\mingw32-make.exe" -w
mingw32-make: Entering directory `E:/Projects/Sources/QTTest-build-desktop'
E:/Projects/qt/mingw/bin/mingw32-make -f Makefile.Debug
mingw32-make[1]: Entering directory `E:/Projects/Sources/QTTest-build-desktop'
g++ -c -g -frtti -fno-exceptions -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DD_SHARED_LIB -DUNICODE -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"..\..\qt\include\QtCore" -I"..\..\qt\include\QtGui" -I"..\..\qt\include" -I"..\..\qt\include\ActiveQt" -I"debug" -I"..\QTTest" -I"." -I"..\..\qt\mkspecs\win32-g++" -o debug\main.o ..\QTTest\main.cpp
..\QTTest\main.cpp:34: warning: deprecated conversion from string constant to 'char*'
..\QTTest\main.cpp:34: warning: deprecated conversion from string constant to 'char*'
..\QTTest\main.cpp:34: warning: deprecated conversion from string constant to 'char*'
..\QTTest\main.cpp:34: warning: deprecated conversion from string constant to 'char*'
..\QTTest\main.cpp:34: warning: deprecated conversion from string constant to 'char*'
..\QTTest\main.cpp:34: warning: deprecated conversion from string constant to 'char*'
..\QTTest\main.cpp: In function 'int Load(PLUGINLINK*)':
..\QTTest\main.cpp:81: warning: deprecated conversion from string constant to 'char*'
..\QTTest\main.cpp:82: warning: deprecated conversion from string constant to 'char*'
g++ -static -static-libgcc -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -shared -Wl,--out-implib,debug\libQTTest0.a -o debug\QTTest0.dll debug/main.o  -L"e:\Projects\qt\lib" debug\QTTest_resource_res.o -lQtGuid -lgdi32 -lcomdlg32 -loleaut32 -limm32 -lwinmm -lwinspool -lmsimg32 -lQtCored -lkernel32 -luser32 -lshell32 -luuid -lole32 -ladvapi32 -lws2_32
Creating library file: debug\libQTTest0.a
mingw32-make[1]: Leaving directory `E:/Projects/Sources/QTTest-build-desktop'
mingw32-make: Leaving directory `E:/Projects/Sources/QTTest-build-desktop'
debug/main.o: In function `PluginMenuCommand':
E:\Projects\Sources\QTTest-build-desktop/../QTTest/main.cpp:48: undefined reference to `_imp___ZN11QMessageBox7warningEP7QWidgetRK7QStringS4_6QFlagsINS_14StandardButtonEES6_'
debug/main.o: In function `QString':
E:\Projects\Sources\QTTest-build-desktop/../../qt/include/QtCore/../../src/corelib/tools/qstring.h:426: undefined reference to `_imp___ZN7QString16fromAscii_helperEPKci'
debug/main.o: In function `~QString':
E:\Projects\Sources\QTTest-build-desktop/../../qt/include/QtCore/../../src/corelib/tools/qstring.h:883: undefined reference to `_imp___ZN7QString4freeEPNS_4DataE'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [debug\QTTest0.dll] Error 1
mingw32-make: *** [debug] Error 2
Процесс "E:\Projects\qt\mingw\bin\mingw32-make.exe" завершился с кодом 2.
Возникла ошибка при сборке проекта QTTest (цель: Настольный компьютер)
Во время выполнения сборки на этапе "Сборка"

Если в свойствах проекта выбрать нестатический qt - оно компилируется, но при вызове мессадж бокса qt крашит приложение.

ПС прошу сильно не пинать, qt только начал осваивать по мере надобности.


---upd---
Попробовал собрать простой пример с этой странички http://www.qtcentre.org/threads/11908-how-to-export-functions-to-dll..-tutorial
Он тоже не собрался примерно с теме же ошибка. Вроде как получается, что я криво собрал qt, но как тогда надо?

---upd---
Попробовал пересоздать проект заного дабы избравиться от мусора - теперь с нестатическим qt все работает, а со статическим не компилится.

---upd---
Поставил Qt Creater 2.0.1 - проблема изменилась, теперь ошибка  cannot find -ljscore
Код:
Выполняется сборка проекта QTTest...
Настройки не изменились, этап qmake пропускается.
Запускается "E:/MinGW/bin/mingw32-make.exe" -w
mingw32-make: Entering directory `E:/Projects/Sources/QTTest-build-desktop'

E:/MinGW/bin/mingw32-make -f Makefile.Debug

mingw32-make[1]: Entering directory `E:/Projects/Sources/QTTest-build-desktop'

g++ -c -g -frtti -fno-exceptions -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DUNICODE -DQT_DLL -DQT_WEBKIT_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"..\..\qt\include\QtCore" -I"..\..\qt\include\QtGui" -I"..\..\qt\include\QtWebKit" -I"..\..\qt\include" -I"..\..\qt\include\ActiveQt" -I"debug" -I"..\QTTest" -I"." -I"..\..\qt\mkspecs\win32-g++" -o debug\main.o ..\QTTest\main.cpp

..\QTTest\main.cpp:38:1: warning: deprecated conversion from string constant to 'char*'

..\QTTest\main.cpp:38:1: warning: deprecated conversion from string constant to 'char*'

..\QTTest\main.cpp:38:1: warning: deprecated conversion from string constant to 'char*'

..\QTTest\main.cpp:38:1: warning: deprecated conversion from string constant to 'char*'

..\QTTest\main.cpp:38:1: warning: deprecated conversion from string constant to 'char*'

..\QTTest\main.cpp:38:1: warning: deprecated conversion from string constant to 'char*'

..\QTTest\main.cpp: In function 'int Load(PLUGINLINK*)':

..\QTTest\main.cpp:90:16: warning: deprecated conversion from string constant to 'char*'

..\QTTest\main.cpp:91:19: warning: deprecated conversion from string constant to 'char*'

..\QTTest\main.cpp:77:28: warning: 'argv' is used uninitialized in this function

g++ -c -g -frtti -fno-exceptions -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DUNICODE -DQT_DLL -DQT_WEBKIT_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"..\..\qt\include\QtCore" -I"..\..\qt\include\QtGui" -I"..\..\qt\include\QtWebKit" -I"..\..\qt\include" -I"..\..\qt\include\ActiveQt" -I"debug" -I"..\QTTest" -I"." -I"..\..\qt\mkspecs\win32-g++" -o debug\utils.o ..\QTTest\utils.cpp

g++ -c -g -frtti -fno-exceptions -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DUNICODE -DQT_DLL -DQT_WEBKIT_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"..\..\qt\include\QtCore" -I"..\..\qt\include\QtGui" -I"..\..\qt\include\QtWebKit" -I"..\..\qt\include" -I"..\..\qt\include\ActiveQt" -I"debug" -I"..\QTTest" -I"." -I"..\..\qt\mkspecs\win32-g++" -o debug\options.o ..\QTTest\options.cpp

g++ -c -g -frtti -fno-exceptions -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DUNICODE -DQT_DLL -DQT_WEBKIT_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"..\..\qt\include\QtCore" -I"..\..\qt\include\QtGui" -I"..\..\qt\include\QtWebKit" -I"..\..\qt\include" -I"..\..\qt\include\ActiveQt" -I"debug" -I"..\QTTest" -I"." -I"..\..\qt\mkspecs\win32-g++" -o debug\Elise.o ..\QTTest\Elise.cpp

..\QTTest\Elise.cpp: In constructor 'Elise::Elise(HWND__*, int, int, int, int)':

..\QTTest\Elise.cpp:57:28: warning: 'argv' is used uninitialized in this function

g++ -c -g -frtti -fno-exceptions -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DUNICODE -DQT_DLL -DQT_WEBKIT_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"..\..\qt\include\QtCore" -I"..\..\qt\include\QtGui" -I"..\..\qt\include\QtWebKit" -I"..\..\qt\include" -I"..\..\qt\include\ActiveQt" -I"debug" -I"..\QTTest" -I"." -I"..\..\qt\mkspecs\win32-g++" -o debug\services.o ..\QTTest\services.cpp

windres -i ..\QTTest\elise_resources.rc -o debug\elise_resources_res.o --include-dir=./../QTTest -DUNICODE -DQT_LARGEFILE_SUPPORT -DUNICODE -DQT_DLL -DQT_WEBKIT_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT

g++ -static -static-libgcc -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -shared -Wl,--out-implib,debug\libQTTest0.a -o debug\QTTest0.dll debug/main.o debug/utils.o debug/options.o debug/Elise.o debug/services.o  -L"e:\Projects\qt\lib" debug\elise_resources_res.o -lQtWebKitd -ljscore -lshlwapi -lversion -lphonond -lQtNetworkd -lQtGuid -lgdi32 -lcomdlg32 -loleaut32 -limm32 -lwinmm -lwinspool -lmsimg32 -lQtCored -lkernel32 -luser32 -lshell32 -luuid -lole32 -ladvapi32 -lws2_32

mingw32-make[1]: Leaving directory `E:/Projects/Sources/QTTest-build-desktop'

mingw32-make: Leaving directory `E:/Projects/Sources/QTTest-build-desktop'

e:/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../../mingw32/bin/ld.exe: cannot find -ljscore

collect2: ld returned 1 exit status

mingw32-make[1]: *** [debug\QTTest0.dll] Error 1

mingw32-make: *** [debug] Error 2

Процесс "E:/MinGW/bin/mingw32-make.exe" завершился с кодом %2.
Возникла ошибка при сборке проекта QTTest (цель: Настольный компьютер)
Во время выполнения сборки на этапе "Сборка"

---upd---
Нашел такое вот решение http://stackoverflow.com/questions/4333102/cannot-find-ljscore-while-i-am-trying-to-build-qt-4-7-1-static-library
Но что делать, если qt статически собирался да еще и -debug-and-release ? а файлов .prl вообще не находится

---upd---
Сделал как написано по ссыылке выше. jscore теперь находит, и сново ошибки как в первом посте. fail
« Последнее редактирование: Апрель 18, 2011, 23:40 от anaksimandr » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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