Почему статически слинкованный Qt столько занимает?
От: Basil2 Россия https://starostin.msk.ru
Дата: 08.05.20 08:16
Оценка:
Есть простейшее приложение с парой строк ввода.

Если cлинковать его с Qt динамически и приложить требуемые dll, оно занимает примерно 15 Mb.
Если cлинковать его с Qt статически, оно тоже занимает 15 Mb.

Почему??

Я всегда считал, что статическая линковка выбирает только реально используемые функции плюс глобальные данные. Но не может же быть столько данных в Qt...
Проект Minimap Zoom — маппим кусочек экрана компа на планшет.
Проект Levelbuddy — играем в WoW за двух персонажей одновременно.
Re: Почему статически слинкованный Qt столько занимает?
От: K13 http://akvis.com
Дата: 08.05.20 08:51
Оценка: 10 (1)
Здравствуйте, 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 столько занимает?
От: flаt  
Дата: 08.05.20 08:51
Оценка:
> реально используемые функции

Если функции виртуальные, то то они не выбрасываются. Не уверен, правда, насчёт неиспользуемых классов-наследников — кажется, они тоже остаются.
Re: Почему статически слинкованный Qt столько занимает?
От: Zhendos  
Дата: 08.05.20 09:24
Оценка: 7 (2)
Здравствуйте, Basil2, Вы писали:

B>Почему??


B>Я всегда считал, что статическая линковка выбирает только реально используемые функции плюс глобальные данные. Но не может же быть столько данных в Qt...


Опции выбрасывания неиспользуемых функций
редко включены по умолчанию. И в некоторых случаях нужно для
этого особым образом собрать статическую библиотеку.
Например если используется gcc то нужно собрать код с "-ffunction-sections",
и "-fdata-sections", а потом еще нужно передать линковщику флаг "--gc-sections",
чтобы на этапе линковки можно было бы убрать не используемое.

Так что без указания каким компилятором и с какими флагами все это собиралось
это очень странный вопрос.
Re: Почему статически слинкованный Qt столько занимает?
От: kov_serg Россия  
Дата: 08.05.20 10:44
Оценка:
Здравствуйте, Basil2, Вы писали:

B>Есть простейшее приложение с парой строк ввода.


B>Почему??

Если вкратце — потому что это C++
Если интересно посмотри в map файле
Re: Почему статически слинкованный Qt столько занимает?
От: velkin Россия  
Дата: 05.07.20 04:21
Оценка:
Здравствуйте, Basil2, Вы писали:

B>Если cлинковать его с Qt статически, оно тоже занимает 15 Mb.

B>Почему??

Когда-то компилировал
Автор: velkin
Дата: 16.02.12
Qt 4.8 с mingw, так у меня занимало меньше на так сказать хелоу ворлдах в том числе графических. Причём в хелоу ворлд вообще все библиотеки запихал, включая mingw. У тебя скорее всего так скомпилировано и явно 5-ая версия. Но так то даже хеллоу ворлды довольно увесистые, хотя и меньше, чем та же динамические библиотеки.

Статическая компиляция на мой взгляд не нужна, это лишние проблемы. Всё равно, чем больше используешь классов, тем меньше эффективность от статической компиляции. А если в установочном пакете два или более приложения используют Qt. Или сменилась версия Qt, давай опять трать время компилируй статику. Это не говоря уже о лицензиях вроде LGPL.
Re[2]: Почему статически слинкованный Qt столько занимает?
От: Basil2 Россия https://starostin.msk.ru
Дата: 06.07.20 10:26
Оценка:
Здравствуйте, velkin, Вы писали:

V>Статическая компиляция на мой взгляд не нужна, это лишние проблемы.


Да, но программа идет одним единственным экзешником. Куда тут без статики...
Проект Minimap Zoom — маппим кусочек экрана компа на планшет.
Проект Levelbuddy — играем в WoW за двух персонажей одновременно.
Re[2]: Почему статически слинкованный Qt столько занимает?
От: Basil2 Россия https://starostin.msk.ru
Дата: 08.07.20 08:01
Оценка:
Здравствуйте, K13, Вы писали:

K13>По дефолту Qt собрана с поддержкой screen-readers. подсистема общения с читалками экрана ссылается на классы всех возможных виджетов, что включает в бинарник все виртуальные методы используемых классов и все что из них дергается (рекурсивно).


А как их отключить? "configure -no-accessibility" прокатит?

K13>Саму Qt собирали в режиме "каждая функция в отдельной секции кода для линкера"?


Это режим configure -gc-binaries?

K13>В опциях линкера указали /OPT:REF?


Это для MSVC опция? (у меня minGW gcc)
Проект Minimap Zoom — маппим кусочек экрана компа на планшет.
Проект Levelbuddy — играем в WoW за двух персонажей одновременно.
Re[2]: Почему статически слинкованный Qt столько занимает?
От: Basil2 Россия https://starostin.msk.ru
Дата: 08.07.20 10:05
Оценка:
Здравствуйте, 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.
Проект Minimap Zoom — маппим кусочек экрана компа на планшет.
Проект Levelbuddy — играем в WoW за двух персонажей одновременно.
Отредактировано 08.07.2020 10:08 Basil2 . Предыдущая версия .
Re[3]: Почему статически слинкованный Qt столько занимает?
От: Zhendos  
Дата: 08.07.20 10:42
Оценка:
Здравствуйте, 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 столько занимает?
От: Basil2 Россия https://starostin.msk.ru
Дата: 08.07.20 11:49
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>И вы кстати передаете опцию gc-sections не линкеру, а компилятору.

Z>На Linux для передачи опцию линковщику, нужно использовать "-Wl",
Z>то есть либо:

Z>
Z>gcc -Wl,-O1 -Wl,--as-needed -Wl,--gc-sections
Z>

Z>либо если вы работаете с линковщиком напрямую
Z>
Z>ld -O1 --as-needed --gc-sections
Z>


Спасибо. Тут собственно не я передаю, а Boost.Build, которому я указываю "<linkflags>--gc-sections". Но это угребище еще то.

Попробую сделать через -Wl, когда Qt соберется
Проект Minimap Zoom — маппим кусочек экрана компа на планшет.
Проект Levelbuddy — играем в WoW за двух персонажей одновременно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.