Как сделать stati c сборку проекта Qt с внешними (не Qt) библиотеками? - PullRequest
0 голосов
/ 09 апреля 2020

Мне бы хотелось, чтобы приложение, написанное мной с использованием библиотеки Qt в Linux, работало на других машинах без установленной библиотеки Qt. Для этого я сделал сборку stati c библиотеки Qt, указав переключатель -stati c в . / Configure . Переменные окружения PATH и LD_LIBRARY_PATH установлены для Qt stati c build и , которые команда qmake приводит к правильному пути. Итак, мой .pro файл:

QT = core gui widgets
CONFIG += warn_on c++17
CONFIG += static
TARGET = "Process Manager"
INCLUDEPATH = include
HEADERS =   include/processmanager.h \
            include/settingswidget.h \
    include/actionwidget.h
SOURCES =   source/main.cpp \
            source/processmanager.cpp \
            source/settingswidget.cpp \
    source/actionwidget.cpp
RESOURCES = rsc.qrc

Но после того, как я запустил свое приложение на чистом Linux, я получил следующую ошибку:

./Process Manager: error while loading shared libraries: libdouble-conversion.so.3: cannot open shared object file: No such file or directory

результат выполнения скрипта ldd в системе, где я сделал сборку stati c:

linux-vdso.so.1 (0x00007ffdd75fe000)
libwayland-egl.so.1 => /lib/x86_64-linux-gnu/libwayland-egl.so.1 (0x00007f94a9732000)
libXcomposite.so.1 => /lib/x86_64-linux-gnu/libXcomposite.so.1 (0x00007f94a972d000)
libxcb-glx.so.0 => /lib/x86_64-linux-gnu/libxcb-glx.so.0 (0x00007f94a9710000)
libSM.so.6 => /lib/x86_64-linux-gnu/libSM.so.6 (0x00007f94a9705000)
libICE.so.6 => /lib/x86_64-linux-gnu/libICE.so.6 (0x00007f94a96e7000)
libxkbcommon-x11.so.0 => /lib/x86_64-linux-gnu/libxkbcommon-x11.so.0 (0x00007f94a96dc000)
libjpeg.so.8 => /lib/x86_64-linux-gnu/libjpeg.so.8 (0x00007f94a9655000)
libtiff.so.5 => /lib/x86_64-linux-gnu/libtiff.so.5 (0x00007f94a95d4000)
libgbm.so.1 => /lib/x86_64-linux-gnu/libgbm.so.1 (0x00007f94a93d0000)
libdrm.so.2 => /lib/x86_64-linux-gnu/libdrm.so.2 (0x00007f94a93bc000)
libudev.so.1 => /lib/x86_64-linux-gnu/libudev.so.1 (0x00007f94a9391000)
libX11-xcb.so.1 => /lib/x86_64-linux-gnu/libX11-xcb.so.1 (0x00007f94a938c000)
libxcb.so.1 => /lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f94a9361000)
libX11.so.6 => /lib/x86_64-linux-gnu/libX11.so.6 (0x00007f94a9223000)
libEGL.so.1 => /lib/x86_64-linux-gnu/libEGL.so.1 (0x00007f94a9011000)
libfontconfig.so.1 => /lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007f94a8fcb000)
libfreetype.so.6 => /lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007f94a8f10000)
libdbus-1.so.3 => /lib/x86_64-linux-gnu/libdbus-1.so.3 (0x00007f94a8ec1000)
libwayland-cursor.so.0 => /lib/x86_64-linux-gnu/libwayland-cursor.so.0 (0x00007f94a8eb6000)
libwayland-client.so.0 => /lib/x86_64-linux-gnu/libwayland-client.so.0 (0x00007f94a8ea5000)
libxkbcommon.so.0 => /lib/x86_64-linux-gnu/libxkbcommon.so.0 (0x00007f94a8e64000)
libpng16.so.16 => /lib/x86_64-linux-gnu/libpng16.so.16 (0x00007f94a8e2c000)
libharfbuzz.so.0 => /lib/x86_64-linux-gnu/libharfbuzz.so.0 (0x00007f94a8d35000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f94a8d19000)
libdouble-conversion.so.3 (0x00007f94a8cf9000)
libicui18n.so.63 => /lib/x86_64-linux-gnu/libicui18n.so.63 (0x00007f94a8a17000)
libicuuc.so.63 => /lib/x86_64-linux-gnu/libicuuc.so.63 (0x00007f94a8843000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f94a883d000)
libpcre2-16.so.0 => /lib/x86_64-linux-gnu/libpcre2-16.so.0 (0x00007f94a87c2000)
libGL.so.1 => /lib/x86_64-linux-gnu/libGL.so.1 (0x00007f94a8549000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f94a8524000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f94a8336000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f94a81e7000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f94a81cd000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f94a7fdc000)
/lib64/ld-linux-x86-64.so.2 (0x00007f94aa63d000)
libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007f94a7fd3000)
libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f94a7fb7000)
libxcb-xkb.so.1 => /lib/x86_64-linux-gnu/libxcb-xkb.so.1 (0x00007f94a7f9a000)
libwebp.so.6 => /lib/x86_64-linux-gnu/libwebp.so.6 (0x00007f94a7d31000)
libzstd.so.1 => /lib/x86_64-linux-gnu/libzstd.so.1 (0x00007f94a7c8a000)
liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f94a7c63000)
libjbig.so.0 => /lib/x86_64-linux-gnu/libjbig.so.0 (0x00007f94a7a55000)
libPrlDRI.so.1 => /lib/x86_64-linux-gnu/libPrlDRI.so.1 (0x00007f94a7764000)
libXau.so.6 => /lib/x86_64-linux-gnu/libXau.so.6 (0x00007f94a775e000)
libXdmcp.so.6 => /lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f94a7756000)
libPrlWl.so.1 => /lib/x86_64-linux-gnu/libPrlWl.so.1 (0x00007f94a754d000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f94a751f000)
libsystemd.so.0 => /lib/x86_64-linux-gnu/libsystemd.so.0 (0x00007f94a7475000)
libffi.so.6 => /lib/x86_64-linux-gnu/libffi.so.6 (0x00007f94a746b000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f94a7460000)
libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f94a7338000)
libgraphite2.so.3 => /lib/x86_64-linux-gnu/libgraphite2.so.3 (0x00007f94a730b000)
libicudata.so.63 => /lib/x86_64-linux-gnu/libicudata.so.63 (0x00007f94a5918000)
liblz4.so.1 => /lib/x86_64-linux-gnu/liblz4.so.1 (0x00007f94a58f8000)
libgcrypt.so.20 => /lib/x86_64-linux-gnu/libgcrypt.so.20 (0x00007f94a57da000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f94a5766000)
libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x00007f94a5741000)

Из этого видно, что библиотека Qt действительно была статически связана. Тот же сценарий ldd в системе, где я пытался запустить приложение:

...
libdouble-conversion.so.3 => not found
...
libpcre2-16.so.0 => not found
...

Я попытался запустить с libdouble-преобразованием и скомпилировал загруженную библиотеку:

scons
scons DESTDIR=/home/anahel/libdouble-conversion install

И

export LD_LIBRARY_PATH=/home/anahel/double-conversion/usr/local/lib:${LD_LIBRARY_PATH}

После этого я снова попытался собрать свое приложение и запустить скрипт ldd (в системе сборки):

libdouble-conversion.so.3 => /home/anahel/double-conversion/usr/local/lib/libdouble-conversion.so.3 (0x00007ff836ce6000)

Вывод ldd на чистой системе не изменяется. Я пытался построить приложение, как:

qmake -config release
make -Wl,-Bstatic -libdouble-conversion

Но это не сработало. Я действительно не понимаю, что делать ... Можно ли это исправить? Как я могу статически связать все проблемные библиотеки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...