Добрый день. Какие есть идеи на эту тему?

Нужно без установки QT запустить приложение на Linux Debian. Голая система без доступа в инет.

Как подхватить все необходимые dll и где их разместить?

Спасибо.
*** Добавлено: 13.08.2019 14:27:13 ***

вот что выдаёт ldd

 Консоль:
        linux-vdso.so.1 (0x00007ffeca98e000)
        libQt5PrintSupport.so.5 => /opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5PrintSupport.so.5 (0x00007f14213db000)
        libQt5Widgets.so.5 => /opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Widgets.so.5 (0x00007f1420ba2000)
        libQt5Gui.so.5 => /opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Gui.so.5 (0x00007f14203bc000)
        libQt5Sql.so.5 => /opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Sql.so.5 (0x00007f1420174000)
        libQt5Core.so.5 => /opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5 (0x00007f141fa26000)
        libGL.so.1 => /usr/lib/x86_64-linux-gnu/libGL.so.1 (0x00007f141f776000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f141f559000)
        libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f141f1d7000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f141eed3000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f141ecbc000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f141e91d000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f141e701000)
        libicui18n.so.56 => /opt/Qt5.10.0/5.10.0/gcc_64/lib/libicui18n.so.56 (0x00007f141e268000)
        libicuuc.so.56 => /opt/Qt5.10.0/5.10.0/gcc_64/lib/libicuuc.so.56 (0x00007f141deb0000)
        libicudata.so.56 => /opt/Qt5.10.0/5.10.0/gcc_64/lib/libicudata.so.56 (0x00007f141c4cd000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f141c2c9000)
        libgthread-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgthread-2.0.so.0 (0x00007f141c0c7000)
        libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f141bdb1000)
        /lib64/ld-linux-x86-64.so.2 (0x000056ee13d42000)
        libGLX.so.0 => /usr/lib/x86_64-linux-gnu/libGLX.so.0 (0x00007f141bb7f000)
        libGLdispatch.so.0 => /usr/lib/x86_64-linux-gnu/libGLdispatch.so.0 (0x00007f141b8c9000)
        libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f141b656000)
        libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f141b316000)
        libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007f141b102000)
        libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f141aed9000)
        libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f141acd5000)
        libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f141aacf000)
        libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f141a8ba000)
        librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f141a6b2000)

Пытался одну из либ положить рядом с исполняемым файлом. Всё равно ldd показывает, что программа его берёт из старого места.

2 (13.08.2019 18:02:05 отредактировано MozgFx)

Вывод неполный, нет названия самой программы.
Но Вы можете изучить материал который подскажет как копать в заданном направлении:
IBM Изучаем Linux, 101
Управление общими библиотеками
https://www.ibm.com/developerworks/ru/l … index.html
В самом конце:

Загрузка требуемых библиотек
Если вы запускаете старое приложение, которому требуется какая-то предыдущая версия общей библиотеки, или, если вы разрабатываете новую библиотеку или новую версию библиотеки, вам может потребоваться переопределить пути поиска по умолчанию, используемые загрузчиком. Также это может потребоваться сценариям, использующим специфичные для продукта библиотеки, которые могут быть установлены в дереве директории /opt.

Подобно тому, как вы можете изменить переменную PATH для поиска исполняемых файлов, вы можете изменить и значение переменной LD_LIBRARY_PATH, указав через двоеточие директории, в которых будет выполняться поиск общих библиотек прежде чем будут использованы системные библиотеки, перечисленные в файле ld.so.cache. Например, вы можете использовать следующую команду:

 Консоль:
export LD_LIBRARY_PATH=/usr/lib/oldstuff:/opt/IBM/AgentController/lib

3

Ну, кто мне скажет, по какому принципу надо разворачивать исполняемое приложение? Почему в Windows работает, если подложить в папку с программой dll, а в Linux so нет? Должны же быть способы развёртывания приложения?
Есть утилита cqtdeployer, но она на Астре у меня не работает.
Что надо сделать? Может структура каталогов должна быть какая-то, в которой отдельно в папке bin будет лежать исполняемый файл, а либы в другом месте?

Собрал даже статический линковщик, и всё равно на другой машине с Астра не работает, требует либы. Неужели установка QtCreator на машине - это единственный путь?
*** Добавлено: 13.08.2019 18:07:07 ***

mozgfx пишет:

Вывод неполный, нет названия самой программы.
Но Вы можете изучить материал который подскажет как копать в заданном направлении:
IBM Изучаем Linux, 101
Управление общими библиотеками
https://www.ibm.com/developerworks/ru/l … index.html
В самом конце:

Загрузка требуемых библиотек
Если вы запускаете старое приложение, которому требуется какая-то предыдущая версия общей библиотеки, или, если вы разрабатываете новую библиотеку или новую версию библиотеки, вам может потребоваться переопределить пути поиска по умолчанию, используемые загрузчиком. Также это может потребоваться сценариям, использующим специфичные для продукта библиотеки, которые могут быть установлены в дереве директории /opt.

Подобно тому, как вы можете изменить переменную PATH для поиска исполняемых файлов, вы можете изменить и значение переменной LD_LIBRARY_PATH, указав через двоеточие директории, в которых будет выполняться поиск общих библиотек прежде чем будут использованы системные библиотеки, перечисленные в файле ld.so.cache. Например, вы можете использовать следующую команду:

 Консоль:
export LD_LIBRARY_PATH=/usr/lib/oldstuff:/opt/IBM/AgentController/lib

Программа не из репозиториев, и не из инета. Самопальная. Надо её развернуть, чтобы пользователь смог скопировать папку с программой и запустить программу.
LD_LIBRARY_PATH работает, если я указываю ей путь к папке lib  в поставке с QT. Но стоит мне скопировать папку lib в другое место, и указать путь LD_LIBRARY_PATH к новому расположению, её программа уже не видит. Вывод такой, что работает только с установленным QT. Кроме тех либ, что в QT лежат могут же быть другие, которых не будет на другой машине?

*** Добавлено: 13.08.2019 18:09:47 ***

За ссылку спасибо, почитаю, может поможет.

*** Добавлено: 14.08.2019 10:04:55 ***

Скопировал все so, что выдаёт ldd в папку с программой. При запуске LD_LIBRARY_PATH=./ ./программа. Выдаёт ошибку сегментирования. Значит ли это, что so ссылаются на другие so?
Запускал на машине с более старой Астрой.

*** Добавлено: 14.08.2019 14:11:53 ***

Скопировал все so, что выдала ldd для программы в папку с программой, так же скопировал туда же so, которые потребовал плагин для постгре из папки sqldrivers, захожу в папку с программой и делаю

 Консоль:

export LD_LIBRARY_PATH=./

После чего команда ldd без аргументов выдаёт ошибку сегментирования. Vi тоже. Что за ерунда? Я даже ldd не могу выполнить.

На машине, на которой копировал so, все те же шаги приводят к запуску программы. Почему на другой машине ошибка сегментирования?

4

я что-то не понял: судя по выводу ldd все разделяемые объекты нашлись. Что вы хотите?

5 (14.08.2019 18:07:26 отредактировано Rizado)

s.xbatob пишет:

я что-то не понял: судя по выводу ldd все разделяемые объекты нашлись. Что вы хотите?

Они нашлись на одной машине.

Я скопировал их в папку с программой. На другой машине делаю

 Консоль:

export LD_LIBRARY_PATH=./

По идее теперь программа должна их подхватить. Но,  у меня ошибка сегментирования возникает. Вот как. Даже вот так

 Консоль:
ldd

ошибка сегментирования. И так

 Консоль:
vi

А всё это из-за долбаного плагина qpsql, который лежит в папке sqldrivers рядом с исполняемым файлом. Если я папку с плагином убираю, то программа запускается и без

 Консоль:

export LD_LIBRARY_PATH=./

Но, к Postgre, разумеется, я приконнектиться теперь не могу.

Что мне делать, чтобы не было ошибок сегментирования и программа не ругалась на несоответствие библиотек?

Я понимаю, что для кого-то эта проблема не проблема. Когда есть доступ к инету, на машине стоит QT...
А вот на голой машине как заставить работать программу, написанную в QT?

6

Могу предположить, что плагин сам требует какие-то библиотеки (и я даже догадываюсь какие).
Кстати, указывать относительный путь в  LD_LIBRARY_PATH опрометчиво. Только проблема не в этом. Всё находится же (иначе было бы более-менее членораздельное сообщение), только потом что-то в этих библиотеках не стыкуется. Тут надо запускать программу под отладчиком и смотреть где она падает.

7

s.xbatob пишет:

Могу предположить, что плагин сам требует какие-то библиотеки (и я даже догадываюсь какие).
Кстати, указывать относительный путь в  LD_LIBRARY_PATH опрометчиво. Только проблема не в этом. Всё находится же (иначе было бы более-менее членораздельное сообщение), только потом что-то в этих библиотеках не стыкуется. Тут надо запускать программу под отладчиком и смотреть где она падает.

В Qt она не падает.

На другой машине, где падает, я пытаюсь запустить исполняемый модуль.

Как тогда запустить в отладчике?

gdb моя_программа? И что я увижу? Assembler?

8

ivan.tiran пишет:

gdb моя_программа? И что я увижу? Assembler?

Ну, как минимум стек вызовов в месте падения. А если программу скомпилировать с отладочной информацией, то много ещё чего.

Только идея тащить с собой все библиотеки порочная. Вам же нужны всего 3 библиотеки Qt и ещё драйвер БД. И в конце концов, Библиотеки Qt можно попытаться прикомпилировать статически. Не знаю, как в вашем дистрибутиве, но в моём Fedora они в репозиториях есть. Правда, никогда не пробовал.

9

s.xbatob пишет:

Ну, как минимум стек вызовов в месте падения. А если программу скомпилировать с отладочной информацией, то много ещё чего.

Только идея тащить с собой все библиотеки порочная. Вам же нужны всего 3 библиотеки Qt и ещё драйвер БД. И в конце концов, Библиотеки Qt можно попытаться прикомпилировать статически. Не знаю, как в вашем дистрибутиве, но в моём Fedora они в репозиториях есть. Правда, никогда не пробовал.

Дело в том, что после выполнения

 Консоль:
LD_LIBRARY_PATH=./
падает даже ldd. То, есть действительно есть лишние библиотеки, но какие? Не факт, что запустится отладчик, но если запустится, и я найду место падения, там будет написано в какой so?

Статически я компилировал, тоже была ошибка сегментирования. Это в Lazarus всё хорошо. Скомпилировал - запускается везде.

10

ivan.tiran пишет:

Статически я компилировал, тоже была ошибка сегментирования

Тогда двигать библиотеки туда-сюда, похоже без пользы. Ошибка где-то в другом месте.