Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Статическая линковка
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
acen83
Начальство потребовало программу в виде одного большого экзешника. :blink:
Делать нечего, скачал qt-4.4.0, скомпилил (configure -debug-and-release -static -qt-libpng -qt-libjpeg -no-qt3support)...
Ужаснулся размеру (папка qt содержит ~33000 файлов, весит ~14 гигов (и это я еще вырубил компиляцию экзамплов на середине, так как задрался ждать...))...
Может зря? но те экзамплы что успели скомпилиться - работают, так что думаю со сборкой все ок... :huh:

Итак, запускаю Code::blocks, ставлю пути на папку 4.4.0, подключаю QtCore и QtGui, набиваю текст
#include <QApplication>

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);

    return app.exec();
}


...запускаю. На линковке высыпаются ошибки (тут маленький кусок)
E:\Programs\Qt\440\lib\libQtCore.a(qeventdispatcher_win.o):qeventdispatcher_win.cpp:(.text+0xa62)|
|undefined reference to `_WSAAsyncSelect@16'|
E:\Programs\Qt\440\lib\libQtCore.a(qfsfileengine_win.o):qfsfileengine_win.cpp:(.text+0x40cd)||unde
fined reference to `_CoCreateInstance@20'|
E:\Programs\Qt\440\lib\libQtGui.a(qtextedit.o):qtextedit.cpp:(.text+0x2d3)||undefined reference to `QBasicTimer::stop()'|
E:\Programs\Qt\440\lib\libQtGui.a(qtextedit.o):qtextedit.cpp:(.text+0x28ca)||undefined reference to `QBasicTimer::start(int, QObject*)'|
E:\Programs\Qt\440\lib\libQtGui.a(qtextedit.o):qtextedit.cpp:(.text$_ZN16QTextEditPrivateD1Ev[QTextEditPrivate::~QTextEditPrivate()]+0x87)||und
efined reference to `QBasicTimer::stop()'|
E:\Programs\Qt\440\lib\libQtGui.a(qtextedit.o):qtextedit.cpp:(.text$_ZN16QTextEditPrivateD1Ev[QTextEditPrivate::~QTextEditPrivate()]+0x131)||un
defined reference to `QBasicTimer::stop()'|


Попробовал через "qmake -project, qmake, make" - та же ботва....
Может кто сталкивался с подобным? :o
ViGOur
А ты при сборке этого примера указал, чтобы он собирался как статический?

Посмотри *.pro файлы примеров, которые у тебя работаю... ;)
acen83
*DELETED*

UPDATE:
Подсмотрел в MakeFil'e параметры линковщика

-lmingw32 -lqtmain -lQtGui -lgdi32 -lcomdlg32 -loleaut32 -limm32 -lwinmm -lwinspool -lmsimg32 -lQtCore -lkernel32 -luser32 -lshell32 -luuid -lole32 -ladvapi32 -lws2_32

воткнул в codeblocks - заработало... спасибо за наводку ;)
rich
решил Qt пересобрать статично, сделал make confclean.
это нормально что в конце такое:
Не удается найти C:\Qt\4.3.2\qmake\project.o
del qmake
Не удается найти C:\Qt\4.3.2\qmake\qmake
mingw32-make[1]: Leaving directory `C:/Qt/4.3.2/qmake'
:huh:
make confclean быстро выполнился,если выполнился конечно :)
ViGOur
В принципе make confclean достаточно быстро отрабатывает, по крайней мере у меня на машине.
А это по идее нормально, так как qmake вроде тоде должен удаляться, честно говоря не обращал внимания.
rich
а этим
.
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-rel
oc -Wl,-s -mthreads -Wl -Wl,-subsystem,windows -o "..\..\bin\assistant.exe" obje
ct_script.assistant.Release  -L"c:\Qt\4.3.2\lib" -L"c:\Qt\4.3.2\lib" -lmingw32 -
lqtmain tmp\obj\release_static\assistant_res.o -lQtXml -lQtGui -lQtNetwork -lgdi
32 -lcomdlg32 -loleaut32 -limm32 -lwinmm -lwinspool -lmsimg32 -lQtCore -lkernel3
2 -luser32 -lshell32 -luuid -lole32 -ladvapi32 -lws2_32
C:\Qt\MinGW\bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\bin\ld.exe: cannot
open output file ..\..\bin\assistant.exe: Permission denied
collect2: ld returned 1 exit status
mingw32-make[3]: *** [..\..\bin\assistant.exe] Error 1
mingw32-make[3]: Leaving directory `C:/Qt/4.3.2/tools/assistant'
mingw32-make[2]: *** [release] Error 2
mingw32-make[2]: Leaving directory `C:/Qt/4.3.2/tools/assistant'
mingw32-make[1]: *** [sub-assistant-make_default-ordered] Error 2
mingw32-make[1]: Leaving directory `C:/Qt/4.3.2/tools'
mingw32-make: *** [sub-tools-make_default-ordered] Error 2

(configure кончилось,вот только что.
простой пример,компалил минуть 5ть, а в итоге 55,9 МБ вместо 2,28 МБ и всЁ равно без mingwn10.dll не запускается :unsure: :unsure:

Цитата(ViGOur @ 6.7.2008, 17:17) *
А ты при сборке этого примера указал, чтобы он собирался как статический?

Посмотри *.pro файлы примеров, которые у тебя работаю... ;)

а что при сборке указывать надо?
Гость
rich,
Цитата
решил Qt пересобрать статично, сделал make confclean.
это нормально что в конце такое:
Не удается найти C:\Qt\4.3.2\qmake\project.o
del qmake
Не удается найти C:\Qt\4.3.2\qmake\qmake
mingw32-make[1]: Leaving directory `C:/Qt/4.3.2/qmake'

make confclean быстро выполнился,если выполнился конечно

Лучше удаляй все папку, раскоковывай qt и заново собирай - эти скрипты (confclean) ужасно глючат после того если хотя бы один файл не был найден, они заканчивают свою работу, не доводя ее до конца.
void*
Цитата(Гость_Гость_* @ 8.7.2008, 9:35) *
скрипты (confclean) ужасно глючат

как сказать :) у меня сейчас собрана Qt перед сборкой которой я раз пять собирал ее и делал make confclean'ы
rich
Цитата(void* @ 8.7.2008, 13:18) *
Цитата(Гость_Гость_* @ 8.7.2008, 9:35) *
скрипты (confclean) ужасно глючат

как сказать :) у меня сейчас собрана Qt перед сборкой которой я раз пять собирал ее и делал make confclean'ы

эээ.. :scratch_one-s_head: тоесть как я понял несколько сборок Qt перед успешной?
void*
Цитата(rich @ 8.7.2008, 18:52) *
тоесть как я понял несколько сборок Qt перед успешной?

это я экспериментировал, ты не думай что ее надо по пять раз собирать :) достаточно одного :)
rich
Цитата(void* @ 8.7.2008, 19:25) *
Цитата(rich @ 8.7.2008, 18:52) *
тоесть как я понял несколько сборок Qt перед успешной?

это я экспериментировал, ты не думай что ее надо по пять раз собирать :) достаточно одного :)

:rolleyes:
так не собирается же с первого раза :unsure:
у меня :(
а что при сборке надо указывать чтобы пример собрался как статический? Qt не достаточно статично собрать?
void*
по-моему достаточно статической сборки самого Qt. попробуй все-таки сделать make confclean и пересобрать, только дождись конца :)
т.е. :
configure -static // + еще опции которые тебе нужны

затем:
make

и потом:
sudo make install //или просто make install, если в винде
ViGOur
Цитата(void* @ 8.7.2008, 21:57) *
или просто make install, если в винде
В винде это не обязательно. :)
void*
может быть, я в винде не собирал, поэтому точно сказать не могу :)
Litkevich Yuriy
Цитата(rich @ 8.7.2008, 23:50) *
а что при сборке надо указывать чтобы пример собрался как статический?

надо в файл проекта забить:
CONFIG=+static
(это по памяти, смотри примеры как ViGOur советовал )
Red Devil
Вроде как для того чтобы убрать зависимость от mingw.dll нужно в makefile добавить опцию :
LFLAGS -= -mthreads
Litkevich Yuriy
относительно компиллерной библиотеки:
Цитата
<QTDIR>\mkspecs\win32-g++\qmake.conf:
1. Change
QMAKE_LFLAGS = -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc
to (add -static)
QMAKE_LFLAGS = -static -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc

взято тут
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.