LINUX.ORG.RU

ldd показывает много (65) зависимостей даже в статически-собранном Qt-приложении

 , ,


0

1

Я сконфигурировал и собрал Qt 5.15 статически

mkdir ~/data
cd ~/data
wget https://download.qt.io/archive/qt/5.15/5.15.5/single/qt-everywhere-opensource-src-5.15.5.tar.xz
tar -xf qt-everywhere-opensource-src-5.15.5.tar.xz -C qt-5.15-v1
cd qt-5.15-v1/qt-everywhere-src-5.15.5/

./configure -static -prefix /opt/qt-5.15-v1-static -confirm-license -opensource -nomake examples -nomake tests -nomake tools -skip qtwebengine

Вот результат команды configure https://pastebin.com/7EeqfH0N

Установил Qt, успешно в каталог /opt/qt-5.15-v1-static

make
sudo make install

Потом собрал Hello-world проект без QML с одним MainWindow. Вот его файл проекта:

QT += core gui widgets
CONFIG += c++11
SOURCES += main.cpp mainwindow.cpp
HEADERS += mainwindow.h
cd ~/data/tinytest/
export PATH=/opt/qt-5.15-v1-static/bin:$PATH
qmake tinytest.pro -config release
make

Вот полный вывод сборки: https://pastebin.com/rxvqu7Uj

Замечание: почему-то в строке линковки НЕТ опции -static, хотя в configure она передавалась

После сборки бинарник содержит очень много зависимостей:

user@host:~/data/tinytest$ ldd tinytest
        linux-vdso.so.1 (0x00007ffc715dd000)
        libxcb-glx.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-glx.so.0 (0x00007f21798e7000)
        libxcb-icccm.so.4 => /usr/lib/x86_64-linux-gnu/libxcb-icccm.so.4 (0x00007f21796e2000)
        libxcb-image.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-image.so.0 (0x00007f21794dd000)
        libxcb-shm.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-shm.so.0 (0x00007f21792da000)
        libxcb-keysyms.so.1 => /usr/lib/x86_64-linux-gnu/libxcb-keysyms.so.1 (0x00007f21790d7000)
        libxcb-randr.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-randr.so.0 (0x00007f2178ec7000)
        libxcb-render-util.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-render-util.so.0 (0x00007f2178cc3000)
        libxcb-render.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-render.so.0 (0x00007f2178ab6000)
        libxcb-shape.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-shape.so.0 (0x00007f21788b2000)
        libxcb-sync.so.1 => /usr/lib/x86_64-linux-gnu/libxcb-sync.so.1 (0x00007f21786ab000)
        libxcb-xfixes.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-xfixes.so.0 (0x00007f21784a3000)
        libxcb-xinerama.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-xinerama.so.0 (0x00007f21782a0000)
        libxcb-xkb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb-xkb.so.1 (0x00007f2178084000)
        libxcb-xinput.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-xinput.so.0 (0x000
... 69 библиотек

Вот полный вывод https://pastebin.com/iMPJZkFk

Я использовал официальное руководство https://doc.qt.io/qt-5/linux-deployment.html

Я знаю что эти 4 библиотеки нельзя собрать статически: linux-vdso.so libc.so libpthread.so ld-linux-x86-64.so

Вопрос: почему остальные 65, почему не собрались? Не могу найти упоминания об этом ни в одном руководстве/мануале/статье



Последнее исправление: JANB (всего исправлений: 1)

Я использовал официальное руководство https://doc.qt.io/qt-5/linux-deployment.html

Врёшь. Там кучу раз написано «статически слинкованные qt библиотеки». Речь именно про них, и только про них. И если б ты читал то руководство, а не только копипастил из него команды, то не задвал бы этого вопроса.

firkax ★★★★★
()
Ответ на: комментарий от JANB

Попробуй добавить -static в аргументы линкера

Замечание: почему-то в строке линковки НЕТ опции -static, хотя в configure она передавалась

Вот сюда. Может получится.

firkax ★★★★★
()

Вопрос: почему остальные 65, почему не собрались? Не могу найти упоминания об этом ни в одном руководстве/мануале/статье

Потому что полностью статический бинарь Qt-приложения тогда бы весил под 300 МБ, тянул бы с собой либы поддержки X11, Wayland, GL, Vulkan и т. д. А так не делают.

Вообще в 2022 году собирать какие-то статические бинари нафиг никому не нужно. Собери пакет под конкретный дистрибутив, либо Flatpak, AppImage или Snap.

EXL ★★★★★
()
Ответ на: комментарий от EXL

Вообще в 2022 году собирать какие-то статические бинари нафиг никому не нужно. Собери пакет под конкретный дистрибутив, либо Flatpak, AppImage или Snap.

Про флатпак и снап ничего не скажу, но AppImage и идея статической сборки друг другу вроде бы не противоречат. В AppImage можно положить как кутешные либы целиком (и большая часть их объёма будет бесполезно занимать место, т.к. их использует ровно одна программа), так и статический бинарь, в котором не будет ничего лишнего (ну почти). Разница в объёме может оказаться в несколько раз (есть подозрение, что и запускаться будет побыстрее).

Где я не прав?

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от JANB

Тебе нужен appimage какой-нибудь. Статическая линковка в лялексе нормально не поддерживается. Особенно с Qt. Glibc тоже статически не линкуется.

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от hobbit

Где я не прав?

Суть в том, что статический бинарь с Qt в AppImage потребует гораздо больше телодвижений для его создания при этом абсолютно никакого полезного выхлопа не будет.

А затраты давно известны:

  1. Нужна корректная статическая сборка Qt, что далеко не тривиальный процесс. Сборка будет постоянно устаревать. Да и Qt собирается сегодня долго. А некоторые его части вообще нельзя собрать статически.
  2. Различные хаки в исходном коде самого приложения: https://doc.qt.io/qt-5/qtplugin.html#Q_IMPORT_PLUGIN
  3. Проблемы юридического толка (статическая линковка потребует предоставления объектных файлов).
  4. Тяжёлый и долгий старт приложения.

Более того, AppImage приложения с динамической линковкой Qt можно распаковвать, заменить библиотеки на новую версию и запаковать обратно.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)