Flatpack was already mentioned as one example. We use AppImage instead. linuxdeployqt did not include everything as expected. Hence, we use both linuxdeploy and linuxdeployqt. Here is the main part of our script:
#!/bin/bash
export VERSION=1.0.0
echo == Remove old AppDir. ==
rm -rf AppDir
echo == Generate new AppDir. ==
./linuxdeploy-x86_64.AppImage --appdir=AppDir --executable=../release/MyApp --desktop-file=MyApp.desktop --icon-file=MyApp.svg
echo == Bundle Qt libs and create AppImage. ==
cd AppDir
../linuxdeployqt-v8-x86_64.AppImage MyApp.desktop -qmake=/opt/Qt/5.13.2/gcc_64/bin/qmake -appimage
echo == Finish up... ==
mv MyApp-*-x86_64.AppImage ../MyApp-x86_64.AppImage
echo == Done. ==
This works well across many Linux distributions. One disadvantage is that an AppImage includes all necessary Qt libraries instead of using those installed on the system. Therefore AppImages can become quite large. But they avoid most incompatibilities of different versions of dynamic libraries.