Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Dependency Issue of Statically Compiled App Deployment
Forum Updated to NodeBB v4.3 + New Features

Dependency Issue of Statically Compiled App Deployment

Scheduled Pinned Locked Moved Solved General and Desktop
7 Posts 4 Posters 956 Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • BosGemilerB Offline
    BosGemilerB Offline
    BosGemiler
    wrote on last edited by
    #1

    Hi all,
    I want to prepare one static linked app for my application. So, first I compiled Qt6 source files statically in my linux os. And then compiled, linked my project with this static library of qt6. Everything was okay. When I checked my app's dependencies with ldd command , I could see that there is no qt dependency (you can find ldd outputs below). But there were some other dependencies such as libX11-xcb, libOpenGL, libglib etc. I thought that these libraries are common in many linux distros, so it wouldn't be a problem when I tried to run my app in another linux os.

    When I tried to test and run my app in another linux os, I got error about dependencies ("error while loading shared libraries..."). When I run 'ldd' command in this target os, I saw that it complains GLIB is not found. Yes, after my checks, I could see that host and target machines have different glib versions.

    My question is that I am very confused about static app deployment, should I prepare one fully statically app ? When I searched on web, I see that it is not a suggested method. Let's consider glib dependency , how can I avoid this issue on different distros ? Every OS can have a different glib version.

    Thanks.

    // Output of ldd command for my statically linked app
    $ ldd MyApp
            linux-vdso.so.1 (0x00007ffefba29000)
            libdrm.so.2 => /usr/lib/libdrm.so.2 (0x00007fb694a99000)
            libgbm.so.1 => /usr/lib/libgbm.so.1 (0x00007fb694a89000)
            libudev.so.1 => /usr/lib/libudev.so.1 (0x00007fb694a55000)
            libmtdev.so.1 => /usr/lib/libmtdev.so.1 (0x00007fb694a4e000)
            libts.so.0 => /usr/lib/libts.so.0 (0x00007fb694a47000)
            libinput.so.10 => /usr/lib/libinput.so.10 (0x00007fb6949f3000)
            libjasper.so.7 => /usr/lib/libjasper.so.7 (0x00007fb69499b000)
            libjpeg.so.8 => /usr/lib/libjpeg.so.8 (0x00007fb69357d000)
            libmng.so.2 => /usr/lib/libmng.so.2 (0x00007fb69350b000)
            libtiff.so.6 => /usr/lib/libtiff.so.6 (0x00007fb693474000)
            libwebpdemux.so.2 => /usr/lib/libwebpdemux.so.2 (0x00007fb694995000)
            libwebpmux.so.3 => /usr/lib/libwebpmux.so.3 (0x00007fb694988000)
            libwebp.so.7 => /usr/lib/libwebp.so.7 (0x00007fb693407000)
            libsharpyuv.so.0 => /usr/lib/libsharpyuv.so.0 (0x00007fb69497e000)
            libxcb-glx.so.0 => /usr/lib/libxcb-glx.so.0 (0x00007fb694961000)
            libX11-xcb.so.1 => /usr/lib/libX11-xcb.so.1 (0x00007fb69495c000)
            libX11.so.6 => /usr/lib/libX11.so.6 (0x00007fb6932c4000)
            libEGL.so.1 => /usr/lib/libEGL.so.1 (0x00007fb6932b2000)
            libGLX.so.0 => /usr/lib/libGLX.so.0 (0x00007fb693280000)
            libOpenGL.so.0 => /usr/lib/libOpenGL.so.0 (0x00007fb693255000)
            libpng16.so.16 => /usr/lib/libpng16.so.16 (0x00007fb69321c000)
            libharfbuzz.so.0 => /usr/lib/libharfbuzz.so.0 (0x00007fb693120000)
            libmd4c.so.0 => /usr/lib/libmd4c.so.0 (0x00007fb69310a000)
            libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x00007fb69302d000)
            libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0x00007fb692fde000)
            libxkbcommon.so.0 => /usr/lib/libxkbcommon.so.0 (0x00007fb692f97000)
            libxkbcommon-x11.so.0 => /usr/lib/libxkbcommon-x11.so.0 (0x00007fb69494f000)
            libxcb-icccm.so.4 => /usr/lib/libxcb-icccm.so.4 (0x00007fb692f90000)
            libxcb-image.so.0 => /usr/lib/libxcb-image.so.0 (0x00007fb692f8a000)
            libxcb-keysyms.so.1 => /usr/lib/libxcb-keysyms.so.1 (0x00007fb692f85000)
            libxcb-randr.so.0 => /usr/lib/libxcb-randr.so.0 (0x00007fb692f71000)
            libxcb-render-util.so.0 => /usr/lib/libxcb-render-util.so.0 (0x00007fb692f6b000)
            libxcb-shm.so.0 => /usr/lib/libxcb-shm.so.0 (0x00007fb692f66000)
            libxcb-sync.so.1 => /usr/lib/libxcb-sync.so.1 (0x00007fb692f5d000)
            libxcb-xfixes.so.0 => /usr/lib/libxcb-xfixes.so.0 (0x00007fb692f54000)
            libxcb-render.so.0 => /usr/lib/libxcb-render.so.0 (0x00007fb692f45000)
            libxcb-shape.so.0 => /usr/lib/libxcb-shape.so.0 (0x00007fb692f3d000)
            libxcb-xkb.so.1 => /usr/lib/libxcb-xkb.so.1 (0x00007fb692f1e000)
            libxcb.so.1 => /usr/lib/libxcb.so.1 (0x00007fb692ef3000)
            libSM.so.6 => /usr/lib/libSM.so.6 (0x00007fb692ee8000)
            libICE.so.6 => /usr/lib/libICE.so.6 (0x00007fb692eca000)
            libgobject-2.0.so.0 => /usr/lib/libgobject-2.0.so.0 (0x00007fb692e68000)
            libgio-2.0.so.0 => /usr/lib/libgio-2.0.so.0 (0x00007fb692c90000)
            libdbus-1.so.3 => /usr/lib/libdbus-1.so.3 (0x00007fb692c3f000)
            libbrotlidec.so.1 => /usr/lib/libbrotlidec.so.1 (0x00007fb692c31000)
            libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0x00007fb692bdd000)
            libz.so.1 => /usr/lib/libz.so.1 (0x00007fb692bc3000)
            libdouble-conversion.so.3 => /usr/lib/libdouble-conversion.so.3 (0x00007fb692bad000)
            libicui18n.so.72 => /usr/lib/libicui18n.so.72 (0x00007fb692800000)
            libicuuc.so.72 => /usr/lib/libicuuc.so.72 (0x00007fb692400000)
            libicudata.so.72 => /usr/lib/libicudata.so.72 (0x00007fb690600000)
            libpcre2-16.so.0 => /usr/lib/libpcre2-16.so.0 (0x00007fb692772000)
            libzstd.so.1 => /usr/lib/libzstd.so.1 (0x00007fb69269f000)
            libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0x00007fb6904b6000)
            libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0x00007fb692ba4000)
            libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007fb690200000)
            libm.so.6 => /usr/lib/libm.so.6 (0x00007fb690113000)
            libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007fb692b7f000)
            libc.so.6 => /usr/lib/libc.so.6 (0x00007fb68ff29000)
            /lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007fb694ae2000)
            libwayland-server.so.0 => /usr/lib/libwayland-server.so.0 (0x00007fb692b69000)
            libexpat.so.1 => /usr/lib/libexpat.so.1 (0x00007fb692b3c000)
            libcap.so.2 => /usr/lib/libcap.so.2 (0x00007fb692693000)
            libdl.so.2 => /usr/lib/libdl.so.2 (0x00007fb692b37000)
            libevdev.so.2 => /usr/lib/libevdev.so.2 (0x00007fb692675000)
            libwacom.so.9 => /usr/lib/libwacom.so.9 (0x00007fb692667000)
            liblcms2.so.2 => /usr/lib/liblcms2.so.2 (0x00007fb692601000)
            liblzma.so.5 => /usr/lib/liblzma.so.5 (0x00007fb690483000)
            libGLdispatch.so.0 => /usr/lib/libGLdispatch.so.0 (0x00007fb68fe71000)
            libgraphite2.so.3 => /usr/lib/libgraphite2.so.3 (0x00007fb6923dd000)
            libbz2.so.1.0 => /usr/lib/libbz2.so.1.0 (0x00007fb68fe5e000)
            libxcb-util.so.1 => /usr/lib/libxcb-util.so.1 (0x00007fb6923d6000)
            libXau.so.6 => /usr/lib/libXau.so.6 (0x00007fb6923d1000)
            libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0x00007fb69047b000)
            libuuid.so.1 => /usr/lib/libuuid.so.1 (0x00007fb68fe55000)
            libffi.so.8 => /usr/lib/libffi.so.8 (0x00007fb68fe4a000)
            libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0x00007fb68fe43000)
            libmount.so.1 => /usr/lib/libmount.so.1 (0x00007fb68fdf5000)
            libsystemd.so.0 => /usr/lib/libsystemd.so.0 (0x00007fb68fd0d000)
            libbrotlicommon.so.1 => /usr/lib/libbrotlicommon.so.1 (0x00007fb68fcea000)
            libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0x00007fb68fc12000)
            libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0x00007fb68fbe4000)
            libcom_err.so.2 => /usr/lib/libcom_err.so.2 (0x00007fb68fbdc000)
            libkrb5support.so.0 => /usr/lib/libkrb5support.so.0 (0x00007fb68fbce000)
            libkeyutils.so.1 => /usr/lib/libkeyutils.so.1 (0x00007fb68fbc7000)
            libresolv.so.2 => /usr/lib/libresolv.so.2 (0x00007fb68fbb5000)
            libpcre2-8.so.0 => /usr/lib/libpcre2-8.so.0 (0x00007fb68fb1a000)
            libgudev-1.0.so.0 => /usr/lib/libgudev-1.0.so.0 (0x00007fb68fb0b000)
            libblkid.so.1 => /usr/lib/libblkid.so.1 (0x00007fb68facf000)
            libgcrypt.so.20 => /usr/lib/libgcrypt.so.20 (0x00007fb68f987000)
            liblz4.so.1 => /usr/lib/liblz4.so.1 (0x00007fb68f965000)
            libgpg-error.so.0 => /usr/lib/libgpg-error.so.0 (0x00007fb68f93f000)
    
    
    SGaistS W 2 Replies Last reply
    1
    • BosGemilerB BosGemiler

      Hi all,
      I want to prepare one static linked app for my application. So, first I compiled Qt6 source files statically in my linux os. And then compiled, linked my project with this static library of qt6. Everything was okay. When I checked my app's dependencies with ldd command , I could see that there is no qt dependency (you can find ldd outputs below). But there were some other dependencies such as libX11-xcb, libOpenGL, libglib etc. I thought that these libraries are common in many linux distros, so it wouldn't be a problem when I tried to run my app in another linux os.

      When I tried to test and run my app in another linux os, I got error about dependencies ("error while loading shared libraries..."). When I run 'ldd' command in this target os, I saw that it complains GLIB is not found. Yes, after my checks, I could see that host and target machines have different glib versions.

      My question is that I am very confused about static app deployment, should I prepare one fully statically app ? When I searched on web, I see that it is not a suggested method. Let's consider glib dependency , how can I avoid this issue on different distros ? Every OS can have a different glib version.

      Thanks.

      // Output of ldd command for my statically linked app
      $ ldd MyApp
              linux-vdso.so.1 (0x00007ffefba29000)
              libdrm.so.2 => /usr/lib/libdrm.so.2 (0x00007fb694a99000)
              libgbm.so.1 => /usr/lib/libgbm.so.1 (0x00007fb694a89000)
              libudev.so.1 => /usr/lib/libudev.so.1 (0x00007fb694a55000)
              libmtdev.so.1 => /usr/lib/libmtdev.so.1 (0x00007fb694a4e000)
              libts.so.0 => /usr/lib/libts.so.0 (0x00007fb694a47000)
              libinput.so.10 => /usr/lib/libinput.so.10 (0x00007fb6949f3000)
              libjasper.so.7 => /usr/lib/libjasper.so.7 (0x00007fb69499b000)
              libjpeg.so.8 => /usr/lib/libjpeg.so.8 (0x00007fb69357d000)
              libmng.so.2 => /usr/lib/libmng.so.2 (0x00007fb69350b000)
              libtiff.so.6 => /usr/lib/libtiff.so.6 (0x00007fb693474000)
              libwebpdemux.so.2 => /usr/lib/libwebpdemux.so.2 (0x00007fb694995000)
              libwebpmux.so.3 => /usr/lib/libwebpmux.so.3 (0x00007fb694988000)
              libwebp.so.7 => /usr/lib/libwebp.so.7 (0x00007fb693407000)
              libsharpyuv.so.0 => /usr/lib/libsharpyuv.so.0 (0x00007fb69497e000)
              libxcb-glx.so.0 => /usr/lib/libxcb-glx.so.0 (0x00007fb694961000)
              libX11-xcb.so.1 => /usr/lib/libX11-xcb.so.1 (0x00007fb69495c000)
              libX11.so.6 => /usr/lib/libX11.so.6 (0x00007fb6932c4000)
              libEGL.so.1 => /usr/lib/libEGL.so.1 (0x00007fb6932b2000)
              libGLX.so.0 => /usr/lib/libGLX.so.0 (0x00007fb693280000)
              libOpenGL.so.0 => /usr/lib/libOpenGL.so.0 (0x00007fb693255000)
              libpng16.so.16 => /usr/lib/libpng16.so.16 (0x00007fb69321c000)
              libharfbuzz.so.0 => /usr/lib/libharfbuzz.so.0 (0x00007fb693120000)
              libmd4c.so.0 => /usr/lib/libmd4c.so.0 (0x00007fb69310a000)
              libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x00007fb69302d000)
              libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0x00007fb692fde000)
              libxkbcommon.so.0 => /usr/lib/libxkbcommon.so.0 (0x00007fb692f97000)
              libxkbcommon-x11.so.0 => /usr/lib/libxkbcommon-x11.so.0 (0x00007fb69494f000)
              libxcb-icccm.so.4 => /usr/lib/libxcb-icccm.so.4 (0x00007fb692f90000)
              libxcb-image.so.0 => /usr/lib/libxcb-image.so.0 (0x00007fb692f8a000)
              libxcb-keysyms.so.1 => /usr/lib/libxcb-keysyms.so.1 (0x00007fb692f85000)
              libxcb-randr.so.0 => /usr/lib/libxcb-randr.so.0 (0x00007fb692f71000)
              libxcb-render-util.so.0 => /usr/lib/libxcb-render-util.so.0 (0x00007fb692f6b000)
              libxcb-shm.so.0 => /usr/lib/libxcb-shm.so.0 (0x00007fb692f66000)
              libxcb-sync.so.1 => /usr/lib/libxcb-sync.so.1 (0x00007fb692f5d000)
              libxcb-xfixes.so.0 => /usr/lib/libxcb-xfixes.so.0 (0x00007fb692f54000)
              libxcb-render.so.0 => /usr/lib/libxcb-render.so.0 (0x00007fb692f45000)
              libxcb-shape.so.0 => /usr/lib/libxcb-shape.so.0 (0x00007fb692f3d000)
              libxcb-xkb.so.1 => /usr/lib/libxcb-xkb.so.1 (0x00007fb692f1e000)
              libxcb.so.1 => /usr/lib/libxcb.so.1 (0x00007fb692ef3000)
              libSM.so.6 => /usr/lib/libSM.so.6 (0x00007fb692ee8000)
              libICE.so.6 => /usr/lib/libICE.so.6 (0x00007fb692eca000)
              libgobject-2.0.so.0 => /usr/lib/libgobject-2.0.so.0 (0x00007fb692e68000)
              libgio-2.0.so.0 => /usr/lib/libgio-2.0.so.0 (0x00007fb692c90000)
              libdbus-1.so.3 => /usr/lib/libdbus-1.so.3 (0x00007fb692c3f000)
              libbrotlidec.so.1 => /usr/lib/libbrotlidec.so.1 (0x00007fb692c31000)
              libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0x00007fb692bdd000)
              libz.so.1 => /usr/lib/libz.so.1 (0x00007fb692bc3000)
              libdouble-conversion.so.3 => /usr/lib/libdouble-conversion.so.3 (0x00007fb692bad000)
              libicui18n.so.72 => /usr/lib/libicui18n.so.72 (0x00007fb692800000)
              libicuuc.so.72 => /usr/lib/libicuuc.so.72 (0x00007fb692400000)
              libicudata.so.72 => /usr/lib/libicudata.so.72 (0x00007fb690600000)
              libpcre2-16.so.0 => /usr/lib/libpcre2-16.so.0 (0x00007fb692772000)
              libzstd.so.1 => /usr/lib/libzstd.so.1 (0x00007fb69269f000)
              libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0x00007fb6904b6000)
              libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0x00007fb692ba4000)
              libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007fb690200000)
              libm.so.6 => /usr/lib/libm.so.6 (0x00007fb690113000)
              libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007fb692b7f000)
              libc.so.6 => /usr/lib/libc.so.6 (0x00007fb68ff29000)
              /lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007fb694ae2000)
              libwayland-server.so.0 => /usr/lib/libwayland-server.so.0 (0x00007fb692b69000)
              libexpat.so.1 => /usr/lib/libexpat.so.1 (0x00007fb692b3c000)
              libcap.so.2 => /usr/lib/libcap.so.2 (0x00007fb692693000)
              libdl.so.2 => /usr/lib/libdl.so.2 (0x00007fb692b37000)
              libevdev.so.2 => /usr/lib/libevdev.so.2 (0x00007fb692675000)
              libwacom.so.9 => /usr/lib/libwacom.so.9 (0x00007fb692667000)
              liblcms2.so.2 => /usr/lib/liblcms2.so.2 (0x00007fb692601000)
              liblzma.so.5 => /usr/lib/liblzma.so.5 (0x00007fb690483000)
              libGLdispatch.so.0 => /usr/lib/libGLdispatch.so.0 (0x00007fb68fe71000)
              libgraphite2.so.3 => /usr/lib/libgraphite2.so.3 (0x00007fb6923dd000)
              libbz2.so.1.0 => /usr/lib/libbz2.so.1.0 (0x00007fb68fe5e000)
              libxcb-util.so.1 => /usr/lib/libxcb-util.so.1 (0x00007fb6923d6000)
              libXau.so.6 => /usr/lib/libXau.so.6 (0x00007fb6923d1000)
              libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0x00007fb69047b000)
              libuuid.so.1 => /usr/lib/libuuid.so.1 (0x00007fb68fe55000)
              libffi.so.8 => /usr/lib/libffi.so.8 (0x00007fb68fe4a000)
              libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0x00007fb68fe43000)
              libmount.so.1 => /usr/lib/libmount.so.1 (0x00007fb68fdf5000)
              libsystemd.so.0 => /usr/lib/libsystemd.so.0 (0x00007fb68fd0d000)
              libbrotlicommon.so.1 => /usr/lib/libbrotlicommon.so.1 (0x00007fb68fcea000)
              libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0x00007fb68fc12000)
              libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0x00007fb68fbe4000)
              libcom_err.so.2 => /usr/lib/libcom_err.so.2 (0x00007fb68fbdc000)
              libkrb5support.so.0 => /usr/lib/libkrb5support.so.0 (0x00007fb68fbce000)
              libkeyutils.so.1 => /usr/lib/libkeyutils.so.1 (0x00007fb68fbc7000)
              libresolv.so.2 => /usr/lib/libresolv.so.2 (0x00007fb68fbb5000)
              libpcre2-8.so.0 => /usr/lib/libpcre2-8.so.0 (0x00007fb68fb1a000)
              libgudev-1.0.so.0 => /usr/lib/libgudev-1.0.so.0 (0x00007fb68fb0b000)
              libblkid.so.1 => /usr/lib/libblkid.so.1 (0x00007fb68facf000)
              libgcrypt.so.20 => /usr/lib/libgcrypt.so.20 (0x00007fb68f987000)
              liblz4.so.1 => /usr/lib/liblz4.so.1 (0x00007fb68f965000)
              libgpg-error.so.0 => /usr/lib/libgpg-error.so.0 (0x00007fb68f93f000)
      
      
      SGaistS Offline
      SGaistS Offline
      SGaist
      Lifetime Qt Champion
      wrote on last edited by
      #2

      Hi,

      If you want to run your application on multiple distribution, your current best bet is to build on the oldest release your want to support so you ensure that you have compatibility with the largest number. Otherwise, the only other solution is to build all your dependencies statically as well.

      One alternative that give some work but can be interesting nonetheless is to create distribution packages for example Debian's deb, RedHat's rpm. Still on the oldest version you want to support but doing so you will use distribution dependencies which should work later on as well.

      Interested in AI ? www.idiap.ch
      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

      BosGemilerB 1 Reply Last reply
      1
      • SGaistS SGaist

        Hi,

        If you want to run your application on multiple distribution, your current best bet is to build on the oldest release your want to support so you ensure that you have compatibility with the largest number. Otherwise, the only other solution is to build all your dependencies statically as well.

        One alternative that give some work but can be interesting nonetheless is to create distribution packages for example Debian's deb, RedHat's rpm. Still on the oldest version you want to support but doing so you will use distribution dependencies which should work later on as well.

        BosGemilerB Offline
        BosGemilerB Offline
        BosGemiler
        wrote on last edited by
        #3

        @SGaist thank you for your reply.

        Then, I need to create deployment for every linux distro separately. Because, arch and ubuntu can have different dependencies according to their environments. Also, I will research how to prepare packages for package managers.

        But there is another question on my mind now. Let's say that I created one qt static app in my fresh installed ubuntu18. And let's assume that this ubuntu's glib version is 2.5 . And I pointed that this app can run on ubuntu18 in my release doc notes. What if the user will upgrade its glib version afterwards ? I can never know which processes the user will do after its fresh installation. So, is it not my responsibility to consider such possibilities as a developer ? I mean, should I add tested glib version in my release docs, and give the responsibility to the user ? But when we consider the user as customer, then it will not sound nice.

        Or glib and other similar dependencies need only minimum requirements to run app ? Apps developed with glib2.5 can work in glib2.6 environment too, doesn't need to be in exactly same version ?

        Thanks.

        1 Reply Last reply
        0
        • BosGemilerB Offline
          BosGemilerB Offline
          BosGemiler
          wrote on last edited by
          #4

          I found some useful links, and as far as I understood, it is possible to find some ways to avoid such situations.

          Multiple glibc libraries on a single host

          linking both static and dynamic libraries into the same executable

          You can also see that package preparation steps requires some configurations to prevent such situations.

          Arch - Creating packages

          Ubuntu - Creating packages

          1 Reply Last reply
          1
          • BosGemilerB BosGemiler has marked this topic as solved on
          • BosGemilerB BosGemiler

            Hi all,
            I want to prepare one static linked app for my application. So, first I compiled Qt6 source files statically in my linux os. And then compiled, linked my project with this static library of qt6. Everything was okay. When I checked my app's dependencies with ldd command , I could see that there is no qt dependency (you can find ldd outputs below). But there were some other dependencies such as libX11-xcb, libOpenGL, libglib etc. I thought that these libraries are common in many linux distros, so it wouldn't be a problem when I tried to run my app in another linux os.

            When I tried to test and run my app in another linux os, I got error about dependencies ("error while loading shared libraries..."). When I run 'ldd' command in this target os, I saw that it complains GLIB is not found. Yes, after my checks, I could see that host and target machines have different glib versions.

            My question is that I am very confused about static app deployment, should I prepare one fully statically app ? When I searched on web, I see that it is not a suggested method. Let's consider glib dependency , how can I avoid this issue on different distros ? Every OS can have a different glib version.

            Thanks.

            // Output of ldd command for my statically linked app
            $ ldd MyApp
                    linux-vdso.so.1 (0x00007ffefba29000)
                    libdrm.so.2 => /usr/lib/libdrm.so.2 (0x00007fb694a99000)
                    libgbm.so.1 => /usr/lib/libgbm.so.1 (0x00007fb694a89000)
                    libudev.so.1 => /usr/lib/libudev.so.1 (0x00007fb694a55000)
                    libmtdev.so.1 => /usr/lib/libmtdev.so.1 (0x00007fb694a4e000)
                    libts.so.0 => /usr/lib/libts.so.0 (0x00007fb694a47000)
                    libinput.so.10 => /usr/lib/libinput.so.10 (0x00007fb6949f3000)
                    libjasper.so.7 => /usr/lib/libjasper.so.7 (0x00007fb69499b000)
                    libjpeg.so.8 => /usr/lib/libjpeg.so.8 (0x00007fb69357d000)
                    libmng.so.2 => /usr/lib/libmng.so.2 (0x00007fb69350b000)
                    libtiff.so.6 => /usr/lib/libtiff.so.6 (0x00007fb693474000)
                    libwebpdemux.so.2 => /usr/lib/libwebpdemux.so.2 (0x00007fb694995000)
                    libwebpmux.so.3 => /usr/lib/libwebpmux.so.3 (0x00007fb694988000)
                    libwebp.so.7 => /usr/lib/libwebp.so.7 (0x00007fb693407000)
                    libsharpyuv.so.0 => /usr/lib/libsharpyuv.so.0 (0x00007fb69497e000)
                    libxcb-glx.so.0 => /usr/lib/libxcb-glx.so.0 (0x00007fb694961000)
                    libX11-xcb.so.1 => /usr/lib/libX11-xcb.so.1 (0x00007fb69495c000)
                    libX11.so.6 => /usr/lib/libX11.so.6 (0x00007fb6932c4000)
                    libEGL.so.1 => /usr/lib/libEGL.so.1 (0x00007fb6932b2000)
                    libGLX.so.0 => /usr/lib/libGLX.so.0 (0x00007fb693280000)
                    libOpenGL.so.0 => /usr/lib/libOpenGL.so.0 (0x00007fb693255000)
                    libpng16.so.16 => /usr/lib/libpng16.so.16 (0x00007fb69321c000)
                    libharfbuzz.so.0 => /usr/lib/libharfbuzz.so.0 (0x00007fb693120000)
                    libmd4c.so.0 => /usr/lib/libmd4c.so.0 (0x00007fb69310a000)
                    libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x00007fb69302d000)
                    libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0x00007fb692fde000)
                    libxkbcommon.so.0 => /usr/lib/libxkbcommon.so.0 (0x00007fb692f97000)
                    libxkbcommon-x11.so.0 => /usr/lib/libxkbcommon-x11.so.0 (0x00007fb69494f000)
                    libxcb-icccm.so.4 => /usr/lib/libxcb-icccm.so.4 (0x00007fb692f90000)
                    libxcb-image.so.0 => /usr/lib/libxcb-image.so.0 (0x00007fb692f8a000)
                    libxcb-keysyms.so.1 => /usr/lib/libxcb-keysyms.so.1 (0x00007fb692f85000)
                    libxcb-randr.so.0 => /usr/lib/libxcb-randr.so.0 (0x00007fb692f71000)
                    libxcb-render-util.so.0 => /usr/lib/libxcb-render-util.so.0 (0x00007fb692f6b000)
                    libxcb-shm.so.0 => /usr/lib/libxcb-shm.so.0 (0x00007fb692f66000)
                    libxcb-sync.so.1 => /usr/lib/libxcb-sync.so.1 (0x00007fb692f5d000)
                    libxcb-xfixes.so.0 => /usr/lib/libxcb-xfixes.so.0 (0x00007fb692f54000)
                    libxcb-render.so.0 => /usr/lib/libxcb-render.so.0 (0x00007fb692f45000)
                    libxcb-shape.so.0 => /usr/lib/libxcb-shape.so.0 (0x00007fb692f3d000)
                    libxcb-xkb.so.1 => /usr/lib/libxcb-xkb.so.1 (0x00007fb692f1e000)
                    libxcb.so.1 => /usr/lib/libxcb.so.1 (0x00007fb692ef3000)
                    libSM.so.6 => /usr/lib/libSM.so.6 (0x00007fb692ee8000)
                    libICE.so.6 => /usr/lib/libICE.so.6 (0x00007fb692eca000)
                    libgobject-2.0.so.0 => /usr/lib/libgobject-2.0.so.0 (0x00007fb692e68000)
                    libgio-2.0.so.0 => /usr/lib/libgio-2.0.so.0 (0x00007fb692c90000)
                    libdbus-1.so.3 => /usr/lib/libdbus-1.so.3 (0x00007fb692c3f000)
                    libbrotlidec.so.1 => /usr/lib/libbrotlidec.so.1 (0x00007fb692c31000)
                    libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0x00007fb692bdd000)
                    libz.so.1 => /usr/lib/libz.so.1 (0x00007fb692bc3000)
                    libdouble-conversion.so.3 => /usr/lib/libdouble-conversion.so.3 (0x00007fb692bad000)
                    libicui18n.so.72 => /usr/lib/libicui18n.so.72 (0x00007fb692800000)
                    libicuuc.so.72 => /usr/lib/libicuuc.so.72 (0x00007fb692400000)
                    libicudata.so.72 => /usr/lib/libicudata.so.72 (0x00007fb690600000)
                    libpcre2-16.so.0 => /usr/lib/libpcre2-16.so.0 (0x00007fb692772000)
                    libzstd.so.1 => /usr/lib/libzstd.so.1 (0x00007fb69269f000)
                    libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0x00007fb6904b6000)
                    libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0x00007fb692ba4000)
                    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007fb690200000)
                    libm.so.6 => /usr/lib/libm.so.6 (0x00007fb690113000)
                    libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007fb692b7f000)
                    libc.so.6 => /usr/lib/libc.so.6 (0x00007fb68ff29000)
                    /lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007fb694ae2000)
                    libwayland-server.so.0 => /usr/lib/libwayland-server.so.0 (0x00007fb692b69000)
                    libexpat.so.1 => /usr/lib/libexpat.so.1 (0x00007fb692b3c000)
                    libcap.so.2 => /usr/lib/libcap.so.2 (0x00007fb692693000)
                    libdl.so.2 => /usr/lib/libdl.so.2 (0x00007fb692b37000)
                    libevdev.so.2 => /usr/lib/libevdev.so.2 (0x00007fb692675000)
                    libwacom.so.9 => /usr/lib/libwacom.so.9 (0x00007fb692667000)
                    liblcms2.so.2 => /usr/lib/liblcms2.so.2 (0x00007fb692601000)
                    liblzma.so.5 => /usr/lib/liblzma.so.5 (0x00007fb690483000)
                    libGLdispatch.so.0 => /usr/lib/libGLdispatch.so.0 (0x00007fb68fe71000)
                    libgraphite2.so.3 => /usr/lib/libgraphite2.so.3 (0x00007fb6923dd000)
                    libbz2.so.1.0 => /usr/lib/libbz2.so.1.0 (0x00007fb68fe5e000)
                    libxcb-util.so.1 => /usr/lib/libxcb-util.so.1 (0x00007fb6923d6000)
                    libXau.so.6 => /usr/lib/libXau.so.6 (0x00007fb6923d1000)
                    libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0x00007fb69047b000)
                    libuuid.so.1 => /usr/lib/libuuid.so.1 (0x00007fb68fe55000)
                    libffi.so.8 => /usr/lib/libffi.so.8 (0x00007fb68fe4a000)
                    libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0x00007fb68fe43000)
                    libmount.so.1 => /usr/lib/libmount.so.1 (0x00007fb68fdf5000)
                    libsystemd.so.0 => /usr/lib/libsystemd.so.0 (0x00007fb68fd0d000)
                    libbrotlicommon.so.1 => /usr/lib/libbrotlicommon.so.1 (0x00007fb68fcea000)
                    libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0x00007fb68fc12000)
                    libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0x00007fb68fbe4000)
                    libcom_err.so.2 => /usr/lib/libcom_err.so.2 (0x00007fb68fbdc000)
                    libkrb5support.so.0 => /usr/lib/libkrb5support.so.0 (0x00007fb68fbce000)
                    libkeyutils.so.1 => /usr/lib/libkeyutils.so.1 (0x00007fb68fbc7000)
                    libresolv.so.2 => /usr/lib/libresolv.so.2 (0x00007fb68fbb5000)
                    libpcre2-8.so.0 => /usr/lib/libpcre2-8.so.0 (0x00007fb68fb1a000)
                    libgudev-1.0.so.0 => /usr/lib/libgudev-1.0.so.0 (0x00007fb68fb0b000)
                    libblkid.so.1 => /usr/lib/libblkid.so.1 (0x00007fb68facf000)
                    libgcrypt.so.20 => /usr/lib/libgcrypt.so.20 (0x00007fb68f987000)
                    liblz4.so.1 => /usr/lib/liblz4.so.1 (0x00007fb68f965000)
                    libgpg-error.so.0 => /usr/lib/libgpg-error.so.0 (0x00007fb68f93f000)
            
            
            W Offline
            W Offline
            wrosecrans
            wrote on last edited by
            #5

            @BosGemiler said in Dependency Issue of Statically Compiled App Deployment:

            When I checked my app's dependencies with ldd command

            FYI, if you actually made a statically linked binary, ldd would just report that the executable is "not a dynamic executable."

            If you are going to get into the weeds with this sort of thing you need to be precise about whether your goal is to statically link a certain library into a dynamically linked executable, or to make a statically linked executable.

            BosGemilerB 1 Reply Last reply
            1
            • W wrosecrans

              @BosGemiler said in Dependency Issue of Statically Compiled App Deployment:

              When I checked my app's dependencies with ldd command

              FYI, if you actually made a statically linked binary, ldd would just report that the executable is "not a dynamic executable."

              If you are going to get into the weeds with this sort of thing you need to be precise about whether your goal is to statically link a certain library into a dynamically linked executable, or to make a statically linked executable.

              BosGemilerB Offline
              BosGemilerB Offline
              BosGemiler
              wrote on last edited by BosGemiler
              #6

              @wrosecrans thanks for informations.

              As far as I understand, we will expect to see output of "not a dynamic executable" in the case of fully statically executable.

              And in my case, I made qt libraries statically linked but some other dependencies as glib were dynamically linked.

              As you said, it looks important to decide if the exe will be fully or partially statically linked before starting deployment process.

              Meanwhile, I faced with similar dependency issue when I tried to run QtCreator10 in ubuntu18. Because, I see that Ubuntu18 was released long time ago ,and it uses glib version 2.27, on the other hand QtCreator version10 is a new release which uses glib v2.28. In this case, I need to use an old release of QtCreator which will be compatible with ubuntu18. and I think, that example clarify @SGaist 's comment.

              ...your current best bet is to build on the oldest release your want to support so you ensure that you have compatibility with the largest number...

              1 Reply Last reply
              0
              • S Offline
                S Offline
                SimonSchroeder
                wrote on last edited by
                #7

                For Linux deployment we are using AppImages. Besides that there is also Flatpack and Snap, but we settled on AppImage. These will package all dynamic libraries and the executable into a single image that can be executed and launches the actual app. Still, you'll need to use an older Linux distribution (some required tools check for this). We are using a combination of linuxdeploy and linuxdeployqt to create the AppImage. linuxdeployqt is better at fetching the Qt dependencies, but other things work better with linuxdeploy. This would resolve your glib issues as the lib would be included in the AppImage.

                This is not 100% fool proof. However, we compile on CentOS 7 and it works on CentOS (and most likely also RedHat), openSuSE (and most likely also SuSE Enterprise), and Ubuntu 18 and upwards. We used to have an additional AppImage for Ubuntu 16, however this did not work on Ubuntu 20 anymore. We only have very few clients using the Linux version of our app and they mostly use the most recent Ubuntu version. But so far, we don't have any bigger problems with this approach.

                1 Reply Last reply
                2

                • Login

                • Login or register to search.
                • First post
                  Last post
                0
                • Categories
                • Recent
                • Tags
                • Popular
                • Users
                • Groups
                • Search
                • Get Qt Extensions
                • Unsolved