Здравствуйте, Basil2, Вы писали:
B>Есть простейшее приложение с парой строк ввода.
B>Если cлинковать его с Qt динамически и приложить требуемые dll, оно занимает примерно 15 Mb.
15 мегабайт -- вместе с DLL?
B>Если cлинковать его с Qt статически, оно тоже занимает 15 Mb.
B>Почему??
B>Я всегда считал, что статическая линковка выбирает только реально используемые функции плюс глобальные данные. Но не может же быть столько данных в Qt...
Почему это не может?
По дефолту Qt собрана с поддержкой screen-readers. подсистема общения с читалками экрана ссылается на классы всех возможных виджетов, что включает в бинарник все виртуальные методы используемых классов и все что из них дергается (рекурсивно).
Саму Qt собирали в режиме "каждая функция в отдельной секции кода для линкера"? В опциях линкера указали /OPT:REF?
Если нет -- то случайно задетая функция тянет за собой весь .obj со всеми функциями и все на что ссылается любая из них.
Отдельные извращенцы могут собирать кастомный билд например без комбобоксов (такая возможность есть) и прочего "ненужного".
Re: Почему статически слинкованный Qt столько занимает?
Здравствуйте, Basil2, Вы писали:
B>Почему??
B>Я всегда считал, что статическая линковка выбирает только реально используемые функции плюс глобальные данные. Но не может же быть столько данных в Qt...
Опции выбрасывания неиспользуемых функций
редко включены по умолчанию. И в некоторых случаях нужно для
этого особым образом собрать статическую библиотеку.
Например если используется gcc то нужно собрать код с "-ffunction-sections",
и "-fdata-sections", а потом еще нужно передать линковщику флаг "--gc-sections",
чтобы на этапе линковки можно было бы убрать не используемое.
Так что без указания каким компилятором и с какими флагами все это собиралось
это очень странный вопрос.
Почему статически слинкованный Qt столько занимает?
Если cлинковать его с Qt динамически и приложить требуемые dll, оно занимает примерно 15 Mb.
Если cлинковать его с Qt статически, оно тоже занимает 15 Mb.
Почему??
Я всегда считал, что статическая линковка выбирает только реально используемые функции плюс глобальные данные. Но не может же быть столько данных в Qt...
Проект Ребенок8020 — пошаговый гайд как сделать, вырастить и воспитать ребенка.
Re: Почему статически слинкованный Qt столько занимает?
Здравствуйте, Basil2, Вы писали:
B>Есть простейшее приложение с парой строк ввода.
B>Почему??
Если вкратце — потому что это C++
Если интересно посмотри в map файле
Re: Почему статически слинкованный Qt столько занимает?
Qt 4.8 с mingw, так у меня занимало меньше на так сказать хелоу ворлдах в том числе графических. Причём в хелоу ворлд вообще все библиотеки запихал, включая mingw. У тебя скорее всего так скомпилировано и явно 5-ая версия. Но так то даже хеллоу ворлды довольно увесистые, хотя и меньше, чем та же динамические библиотеки.
Статическая компиляция на мой взгляд не нужна, это лишние проблемы. Всё равно, чем больше используешь классов, тем меньше эффективность от статической компиляции. А если в установочном пакете два или более приложения используют Qt. Или сменилась версия Qt, давай опять трать время компилируй статику. Это не говоря уже о лицензиях вроде LGPL.
Re[2]: Почему статически слинкованный Qt столько занимает?
Здравствуйте, K13, Вы писали:
K13>По дефолту Qt собрана с поддержкой screen-readers. подсистема общения с читалками экрана ссылается на классы всех возможных виджетов, что включает в бинарник все виртуальные методы используемых классов и все что из них дергается (рекурсивно).
А как их отключить? "configure -no-accessibility" прокатит?
K13>Саму Qt собирали в режиме "каждая функция в отдельной секции кода для линкера"?
Это режим configure -gc-binaries?
K13>В опциях линкера указали /OPT:REF?
Это для MSVC опция? (у меня minGW gcc)
Проект Ребенок8020 — пошаговый гайд как сделать, вырастить и воспитать ребенка.
Re[2]: Почему статически слинкованный Qt столько занимает?
Здравствуйте, Zhendos, Вы писали:
Z>редко включены по умолчанию. И в некоторых случаях нужно для Z>этого особым образом собрать статическую библиотеку. Z>Так что без указания каким компилятором и с какими флагами все это собиралось Z>это очень странный вопрос.
Я задаю настройки проекта так:
configure -static -static-runtime -platform win32-g++ -release -strip -optimize-size -no-pch -gc-binaries -make libs
Z>Например если используется gcc то нужно собрать код с "-ffunction-sections", Z>и "-fdata-sections",
Я так понимаю, опция конфигуратора "-gc-binaries" именно за это и отвечает.
Z>а потом еще нужно передать линковщику флаг "--gc-sections", Z>чтобы на этапе линковки можно было бы убрать не используемое.
Я попробовал передать этот параметр линкеру (уже при сборке своего проекта, указав в jamroot.jam "<linkflags>--gc-sections". В ответ получаю
gcc.link bin\gcc-7.3.0\debug\runtime-link-static\level_buddy.exe
g++: error: unrecognized command line option '--gc-sections'; did you mean '--data-sections'?
(А если указать "--data-sections", то всё собирается, но размер тот же).
Точно именно "--gc-sections" надо передавать линкеру?
Компилятор mingw730_64.
Проект Ребенок8020 — пошаговый гайд как сделать, вырастить и воспитать ребенка.
Здравствуйте, Basil2, Вы писали:
B>Здравствуйте, Zhendos, Вы писали:
B>Я попробовал передать этот параметр линкеру (уже при сборке своего проекта, указав в jamroot.jam "<linkflags>--gc-sections". В ответ получаю B>gcc.link bin\gcc-7.3.0\debug\runtime-link-static\level_buddy.exe B>g++: error: unrecognized command line option '--gc-sections'; did you mean '--data-sections'? B>(А если указать "--data-sections", то всё собирается, но размер тот же). B>Точно именно "--gc-sections" надо передавать линкеру?
Точно, но я использовал только под Linux.
И вы кстати передаете опцию gc-sections не линкеру, а компилятору.
На Linux для передачи опцию линковщику, нужно использовать "-Wl",
то есть либо:
gcc -Wl,-O1 -Wl,--as-needed -Wl,--gc-sections
либо если вы работаете с линковщиком напрямую
ld -O1 --as-needed --gc-sections
Re[4]: Почему статически слинкованный Qt столько занимает?
Здравствуйте, Zhendos, Вы писали:
Z>И вы кстати передаете опцию gc-sections не линкеру, а компилятору. Z>На Linux для передачи опцию линковщику, нужно использовать "-Wl", Z>то есть либо:
Z>