crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V  < 1 2 3 >  
Ответить в данную темуНачать новую тему
> Создание dll-библиотеки, со статически подлинко-, ванными стадартными Qt-библиотеками
Litkevich Yuriy
  опции профиля:
сообщение 8.6.2010, 20:08
Сообщение #11


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Гость_Гость_evg123_*_* @ 8.6.2010, 23:56) *
Далее, пишу ещё LIB = <путь>/QtCore4.a и процесс компановки проходит замечательно, но создаётся dll c динамическими связями к QtCore4.dll . Если же не писать LIB = <путь>/QtCore4.a , то тогда возникает куча неразрешённых ссылок. Так что какую-то роль всё-таки эта строка LIB = <путь>/QtCore4.a -играет)
а не надо так писать. тебе нужно просто в окружение добавить путь к статически собранной Qt. А точнее %QTDIR%/bin в PATH и ни какой другой версии Qt там быть не должно.
А так ты просто слинковался с динамической сборкой Qt и всё.

Цитата(Гость_Гость_evg123_*_* @ 9.6.2010, 0:04) *
Храню эту копию у себя на случай того, чтобы делать статические приложения. и они по ходу делаются без проблем.
а как ты делаешь приложения статические. Посмотри внимательно, может ты что-то просто упустил из виду при сборке dll'ок.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_evg123_*_*
сообщение 8.6.2010, 20:09
Сообщение #12





Гости








    


Цитата(Litkevich Yuriy @ 8.6.2010, 20:03) *
Для сборки статической версии приложения/dll'ки...

Да вот я перерыл много ихней документации - там ничего не сказано про то что можно собрать дээльэльку статически. Если я собираю статическую либу (т.е. указываю TEMPLATE = lib и не указываю CONFIG = dll) - то у меня получается большая двухмегабайтная либа с расширением *.а Но как только я указал CONFIG = dll - у меня получается крохотная dll-ка размером 99 лилобайт.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_evg123_*_*
сообщение 8.6.2010, 20:11
Сообщение #13





Гости








    


Короче, я поэксперементирую и скажу, что получилось. Спасибо за советы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 8.6.2010, 20:12
Сообщение #14


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Гость_Гость_evg123_*_* @ 9.6.2010, 0:09) *
Если я собираю статическую либу (т.е. указываю TEMPLATE = lib и не указываю CONFIG = dll)
проект статической библиотеки требует:
TEMPLATE = lib
CONFIG = staticlib
А обычной
TEMPLATE = lib
CONFIG = dll
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
evg123
  опции профиля:
сообщение 9.6.2010, 11:29
Сообщение #15


Студент
*

Группа: Участник
Сообщений: 24
Регистрация: 29.4.2009
Из: Минск
Пользователь №: 714

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 8.6.2010, 20:12) *
Цитата(Гость_Гость_evg123_*_* @ 9.6.2010, 0:09) *
Если я собираю статическую либу (т.е. указываю TEMPLATE = lib и не указываю CONFIG = dll)
проект статической библиотеки требует:
TEMPLATE = lib
CONFIG = staticlib
А обычной
TEMPLATE = lib
CONFIG = dll

результаты эксперементов показали следующее:

1.1. Компилировал в мингвине, Qt-Creator-е
Заранее была сделана копия QT (4.5.2) и собрана статически (qt_static)

1.2. Собирал библиотеку со следующей конфигурацией:
# -------------------------------------------------
# Project created by QtCreator 2010-06-03T09:36:13
# -------------------------------------------------
CONFIG += qt staticlib release
QT -= gui
TARGET = comport
TEMPLATE = lib
DEFINES += COMPORT_LIBRARY
SOURCES += comport.cpp \
qextserialport/qextserialport.cpp \
qextserialport/qextserialbase.cpp \
qextserialport/win_qextserialport.cpp \
GlobalVars.cpp
HEADERS += comport.h \
qextserialport/qextserialport.h \
qextserialport/qextserialbase.h \
qextserialport/win_qextserialport.h \
GlobalVars.h \
Global.h \
ThrdSoftTerm.h
LIBS += D:/Qt/2009.03/qt_static/lib/libQtCore4.a


win32 {
QMAKE_LFLAGS += -static-libgcc
}

1.3. В параметрах запуска использовал:
PATH = D:\Qt\2009.03\mingw\bin;D:\Qt\2009.03\qt_static\bin;D:\Program\Microchip\MPLAB C30\bin;D:\Xilinx\11.1\ChipScope\bin\nt64;D:\Xilinx\11.1\common\bin\nt64;D:\Xilinx\11.1\common\lib\nt64;D:\Xilinx\11.1\PlanAhead\bin;D:\Xilinx\11.1\ISE\bin\nt64;D:\Xilinx\11.1\ISE\lib\nt64;D:\Program\Microchip\MCC18\mpasm;D:\Program\Microchip\MCC18\bin;D:\Program\Delphi\Nesterov\Microchip\MCC18\mpasm;D:\Program\Delphi\Nesterov\Microchip\MCC18\bin;D:\Program\Delphi\Nesterov\Microchip\MPLAB IDE\MCC18\mpasm;D:\Program\Delphi\Nesterov\Microchip\MPLAB IDE\MCC18\bin;D:\EDK\bin\nt;C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\;C:\Program Files (x86)\Borland\BDS\4.0\Bin;C:\Program Files\SolidWorks\COSMOS M;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files (x86)\P-CAD 2006 Viewer\;C:\Program Files (x86)\Borland\CaliberRM SDK 2005 R2\lib;C:\Program Files (x86)\Common Files\Autodesk Shared\;%QUARTUS_ROOTDIR%\bin;D:\Program Files\System;D:\Program Files\Altium Designer Winter 09\System;D:\Program\Delphi\Nesterov\Microchip\bin;C:\Program Files (x86)\Microchip\MPLAB C30\bin;D:\Program\Microchip\MPLAB IDE\VDI;D:\Program\Microchip\MPLAB C30\bin;C:\Program Files (x86)\Microsoft SQL Server\80\Tools\Binn\;D:\Microchip Starter Kits\PIC32 Starter Kits\MPLAB C32 Suite\bin;D:\Microchip Starter Kits\PIC32 Starter Kits\MPLAB IDE\VDI;D:\Program\Microchip\MCC18\mpasm;D:\Program\Microchip\MCC18\bin;D:\Program\Delphi\Nesterov\Microchip\MCC18\mpasm;D:\Program\Delphi\Nesterov\Microchip\MCC18\bin;D:\Program\Delphi\Nesterov\Microchip\MPLAB IDE\MCC18\mpasm;D:\Program\Delphi\Nesterov\Microchip\MPLAB IDE\MCC18\bin;c:\program files (x86)\borland\bds\4.0\MyLIB\_BPL;D:\Modeltech_xe\win32xoem;D:\Modeltech_xe_starter\win32xoem

Здесь важно, что путь указан на статическую библиотеку.

1.4. Из D:\Qt\2009.03\qt_static\bin жестоко физически удалил все Qt4.dll - либы

1.5. Результат сборки: собралась библиотека libcomport.a размером 84 466 байт.
Не могу сразу сказать понадобится или нет D:/Qt/2009.03/qt_static/lib/libQtCore4.a для сборки окончательного приложения.

2. Создаю динамическую библиотеку со статически скомпилированной qt:
2.1 файл конфигураций:
CONFIG += qt dll release
QT -= gui
TARGET = comport
TEMPLATE = lib
DEFINES += COMPORT_LIBRARY
SOURCES += comport.cpp \
qextserialport/qextserialport.cpp \
qextserialport/qextserialbase.cpp \
qextserialport/win_qextserialport.cpp \
GlobalVars.cpp
HEADERS += comport.h \
qextserialport/qextserialport.h \
qextserialport/qextserialbase.h \
qextserialport/win_qextserialport.h \
GlobalVars.h \
Global.h \
ThrdSoftTerm.h
LIBS += D:/Qt/2009.03/qt_static/lib/libQtCore4.a

win32 {
QMAKE_LFLAGS += -static-libgcc
}

2.2 параметр PATH, как и прежде

2.3 результат :
получил: comport.dll (размером 59 904 с ссылками на QtCore4.dll)
получил: libcomport.a (размером 99 116 в отличие от 84 466 в предыдущем случае)


3. Если с такими же параметрами компилирую приложение - то оно получается чисто статическое с сылкой только на mingw10.dll (ну и на микрософтовские либы)

Вопрос - может что-то не то с makespec - сейчас посмотрю
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
evg123
  опции профиля:
сообщение 9.6.2010, 12:15
Сообщение #16


Студент
*

Группа: Участник
Сообщений: 24
Регистрация: 29.4.2009
Из: Минск
Пользователь №: 714

Спасибо сказали: 0 раз(а)




Репутация:   0  


Залез в makespec:
D:\Qt\2009.03\qt_static\mkspecs\win32-g++\qmake.conf
- там стоял флаг:
QMAKE_LFLAGS_DLL = -shared

Где - то на форуме прочёл, что нужно:
QMAKE_LFLAGS_DLL = -static

Установил.
Создаю динамическую dll.


CONFIG += qt dll release
QT -= gui
TARGET = comport
TEMPLATE = lib
DEFINES += COMPORT_LIBRARY
SOURCES += comport.cpp \
qextserialport/qextserialport.cpp \
qextserialport/qextserialbase.cpp \
qextserialport/win_qextserialport.cpp \
GlobalVars.cpp
HEADERS += comport.h \
qextserialport/qextserialport.h \
qextserialport/qextserialbase.h \
qextserialport/win_qextserialport.h \
GlobalVars.h \
Global.h \
ThrdSoftTerm.h
LIBS += D:/Qt/2009.03/qt_static/lib/libQtCore4.a

На этапе компановки имею:

g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -Wl,-s -static -mthreads -Wl -Wl,--out-implib,release\libcomport.a -o release\comport.dll release/comport.o release/qextserialport.o release/qextserialbase.o release/win_qextserialport.o release/GlobalVars.o release/moc_qextserialport.o release/moc_qextserialbase.o release/moc_win_qextserialport.o -L"d:\Qt\2009.03\qt_static\lib" D:/Qt/2009.03/qt_static/lib/libQtCore4.a -lQtCore -lkernel32 -luser32 -lshell32 -luuid -lole32 -ladvapi32 -lws2_32
mingw32-make[1]: Leaving directory `D:/WORKDIR/qt-creator-projects/comportdll-static'
mingw32-make: Leaving directory `D:/WORKDIR/qt-creator-projects/comportdll-static'
D:/Qt/2009.03/mingw/bin/../lib/gcc/mingw32/3.4.5/../../..\libmingw32.a(main.o):main.c:(.text+0x104): undefined reference to `WinMain@16'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [release\comport.dll] Error 1
mingw32-make: *** [release] Error 2
Завершено с кодом возврата 2.
Ошибка во время сборки проекта comport
Во время выполнения сборки на этапе 'Make'

Т.е. не определена одна единственная ссылка на WinMain


При статической сбоке имею:

CONFIG += qt staticlib release
QT -= gui
TARGET = comport
TEMPLATE = lib
DEFINES += COMPORT_LIBRARY
SOURCES += comport.cpp \
qextserialport/qextserialport.cpp \
qextserialport/qextserialbase.cpp \
qextserialport/win_qextserialport.cpp \
GlobalVars.cpp
HEADERS += comport.h \
qextserialport/qextserialport.h \
qextserialport/qextserialbase.h \
qextserialport/win_qextserialport.h \
GlobalVars.h \
Global.h \
ThrdSoftTerm.h
LIBS += D:/Qt/2009.03/qt_static/lib/libQtCore4.a

ar -ru release\libcomport.a release/comport.o release/qextserialport.o release/qextserialbase.o release/win_qextserialport.o release/GlobalVars.o release/moc_qextserialport.o release/moc_qextserialbase.o release/moc_win_qextserialport.o
mingw32-make[1]: Leaving directory `D:/WORKDIR/qt-creator-projects/comportdll-static'
mingw32-make: Leaving directory `D:/WORKDIR/qt-creator-projects/comportdll-static'
ar: creating release\libcomport.a
Завершено с кодом возврата 0.

Создаётся библиотека release\libcomport.a размером 84 466 байт
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.6.2010, 9:01
Сообщение #17


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


evg123, важную деталь упускаешь. TEMPLATE = lib нужно писать до зависимой фразы (т.е. до CONFIG += staticlib)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
evg123
  опции профиля:
сообщение 10.6.2010, 9:21
Сообщение #18


Студент
*

Группа: Участник
Сообщений: 24
Регистрация: 29.4.2009
Из: Минск
Пользователь №: 714

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 10.6.2010, 9:01) *
evg123, важную деталь упускаешь. TEMPLATE = lib нужно писать до зависимой фразы (т.е. до CONFIG += staticlib)

Поменял, как вы говорите строчки местами:
QT -= gui
TARGET = comport
TEMPLATE = lib
CONFIG += dll release
DEFINES += COMPORT_LIBRARY
SOURCES += comport.cpp \
.....................
HEADERS += comport.h \
qextserialport/qextserialport.h
.....................
LIBS += D:/Qt/2009.03/qt_static/lib/libQtCore4.a

не помогло. всё также не разрешена ссылка `WinMain@16'
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.6.2010, 9:27
Сообщение #19


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(evg123 @ 10.6.2010, 13:21) *
LIBS += D:/Qt/2009.03/qt_static/lib/libQtCore4.a
ни как не пойму, зачем ты это пишешь?
Во первых этого файла никогда нет при статической сборке Qt!
Этот файл - интерфейс к динамической версии QtCore4.dll
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
evg123
  опции профиля:
сообщение 11.6.2010, 9:25
Сообщение #20


Студент
*

Группа: Участник
Сообщений: 24
Регистрация: 29.4.2009
Из: Минск
Пользователь №: 714

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 10.6.2010, 9:27) *
Цитата(evg123 @ 10.6.2010, 13:21) *
LIBS += D:/Qt/2009.03/qt_static/lib/libQtCore4.a
ни как не пойму, зачем ты это пишешь?
Во первых этого файла никогда нет при статической сборке Qt!
Этот файл - интерфейс к динамической версии QtCore4.dll


1: закоментировал LIB, собрал статическую библиотеку (все другие установки - как и прежде)

QT -= gui
TARGET = comport
TEMPLATE = lib
CONFIG += staticlib release
DEFINES += COMPORT_LIBRARY
SOURCES += comport.cpp \
........................................
HEADERS += comport.h \
........................................
#LIBS += D:/Qt/2009.03/qt_static/lib/libQtCore4.a


статическая библиотека собралась:

ar -ru release\libcomport.a release/comport.o release/qextserialport.o release/qextserialbase.o release/win_qextserialport.o release/GlobalVars.o release/moc_qextserialport.o release/moc_qextserialbase.o release/moc_win_qextserialport.o
mingw32-make[1]: Leaving directory `D:/WORKDIR/qt-creator-projects/comportdll-static'
mingw32-make: Leaving directory `D:/WORKDIR/qt-creator-projects/comportdll-static'
ar: creating release\libcomport.a

Теперь собираю динамически:

QT -= gui
TARGET = comport
TEMPLATE = lib
CONFIG += dll release
DEFINES += COMPORT_LIBRARY
SOURCES += comport.cpp \
...........................................
HEADERS += comport.h \
...........................................
#LIBS += D:/Qt/2009.03/qt_static/lib/libQtCore4.a


Имею:
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -Wl,-s -static -mthreads -Wl -Wl,--out-implib,release\libcomport.a -o release\comport.dll release/comport.o release/qextserialport.o release/qextserialbase.o release/win_qextserialport.o release/GlobalVars.o release/moc_qextserialport.o release/moc_qextserialbase.o release/moc_win_qextserialport.o -L"d:\Qt\2009.03\qt_static\lib" -lQtCore -lkernel32 -luser32 -lshell32 -luuid -lole32 -ladvapi32 -lws2_32
release/qextserialbase.o:qextserialbase.cpp:(.text+0xe): undefined reference to `_imp___ZN7QStringaSERKS_'
release/qextserialbase.o:qextserialbase.cpp:(.text+0x75): undefined reference to `_imp___ZN6QMutexD1Ev'
release/qextserialbase.o:qextserialbase.cpp:(.text+0xb6): undefined reference to `_imp___ZN7QString4freeEPNS_4DataE'
release/qextserialbase.o:qextserialbase.cpp:(.text+0xc8): undefined reference to `_imp___ZN9QIODeviceD2Ev'..............................................
...........................................
и ещё море таких ошибок.

У меня такое впечатление, что qt в статическом варианте позволяет собрать только статическую библиотеку (предназначенную для стптической линковки).
либо динамическую библиотеку со всеми еразрешёнными связями на стандартные библиотеки.

По ходу была мысль: может слинковать dll вручную: запустить g++.exe со всеми требуемыми параметрами?

И ещё вопрос: я считал что libQtCore4.a - это как раз статический вариант динамической библиотеки (а не интерфейс).
Где же именно статическая реализация QtCore4? Или я чего-то не догоняю?








Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V  < 1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 18.2.2025, 11:35