LINUX.ORG.RU

Ошибка при запуске программы: cannot open shared object file: No such file or directory.

 , ,


0

2

Пытаюсь запустить приложение, разработанное на Qt в QtCreator (Debian, gcc 64 bit). Получаю ошибку

error while loading shared libraries: libboost_serialization-mt-d.so.1.61.0: cannot open shared object file: No such file or directory.

Хотя я ожидал что будет как в Visual Studio - просто указать в настройках путь к lib файлу. А здесь он, если я правильно понял, ещё хочет чтобы я .so файл к исполняемому файлу в папку положил или что-то ещё. Какие возможны решения?


Какие возможны решения?

quick&dirty решение — перечислить (через двоеточие) абсолютные пути к so-библиотекам в переменной окружения LD_LIBRARY_PATH

Скажем, если исполнимый файл твоей программы называется a.out, а libboost_serialization-mt-d.so.1.61.0 лежит в директории /home/bla/bla/bla, то для успешного запуска программы из командной строки нужно выполнить следующие команды:

export LD_LIBRARY_PATH=/home/bla/bla/bla
./a.out

Manhunt ★★★★★
()

C LD_LIBRARY_PATH запустилось. А насчёт ld.so.conf - я добавил в /etc/ld.so.conf.d boost_1_61_0.conf:

/opt/boost_1_61_0/lib

Но это не помогло. Что я делаю не так?

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

А что если я хочу распространять этот исполняемый файл?

user08
() автор топика
Ответ на: комментарий от user08

ты сам программу собираешь? Если да, то при компиляции укажи ключи компилятору -Wl,-rpath=<путь, где будут лежать твои динамические библиотеки>

Если у тебя только бинарник — то поправь в нем поле rpath каким-нить patchelf'ом.

Думаю, данных для дальнейшего гугления тебе предостаточно.

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

придется.

И как тогда в таком случае распространять? Вместе с ридми и инстукцией что надо сделать?

Если сильно надо — можно с бустом слинковать статически.

Ну это я изначально и хотел по возможности. Как это можно сделать?

user08
() автор топика
Ответ на: комментарий от user08

точно так же, как и с динамическими либами. Только в одном из путей, по которому линкер ищет библиотеки, должны лежать статические либы буста. Просто по умолчанию ld предпочитает динамическое связывание.

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

unix: LIBS += -L/opt/boost_1_61_0/lib -lboost_serialization-mt

Вот такую строчку я сейчас использую в .pro-файле. В соответствующей папке файлы с расширениями .a и .so.

Что мне нужно поменять?

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

убери из /opt/boost_1_61_0/lib динамические либы и ссылки на них. Говорю ж тебе вроде по-русски — ld предпочитает динамическую линковку.

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

ldconfig-то запускал после этого?

Не запускал. Теперь запустил. И этот способ у меня тоже заработал.

user08
() автор топика
Ответ на: комментарий от user08

из /opt/boost_1_61_0/lib динамические либы и ссылки на них. Говорю ж тебе вроде по-русски — ld предпочитает динамическую линковку.

Я так понял убрать файлы *.so и без расширения? Оставить там только *.a?

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

unix: LIBS += -L/opt/boost_1_61_0/lib -lboost_serialization-mt

unix: LIBS += -L/opt/boost_1_61_0/lib -lboost_serialization-mt -rpath '$ORIGIN'

И положи libboost_serialization-mt-d.so.1.61.0 в директорию с исполняемым файлом.

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

Не -lboost_serialization-mt.a

а /opt/boost_1_61_0/lib/libboost_serialization-mt.a без всяких -L и -l. Удали вообще все строки с -lboost_serialization-mt

Или дай исходники проекта, посмотрю.

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

без всяких -L и -l. Удали вообще все строки с -lboost_serialization-mt

Сейчас у меня так, и вроде работает. Зачем что-то удалять?

unix: LIBS += /opt/boost_1_61_0/lib/libboost_serialization-mt.a
unix: LIBS += -L/opt/boost_1_61_0/lib -lboost_system-mt
unix: LIBS += -L/opt/boost_1_61_0/lib -lboost_filesystem-mt
unix: LIBS += -L/usr/lib/x86_64-linux-gnu -lz
unix: LIBS += -L/usr/lib/x86_64-linux-gnu -lssl
unix: LIBS += -L/usr/lib/x86_64-linux-gnu -lcrypto

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

Сейчас у меня так, и вроде работает. Зачем что-то удалять?

Можно сделать так:

unix: LIBS += /opt/boost_1_61_0/lib/libboost_serialization-mt.a
unix: LIBS += /opt/boost_1_61_0/lib/libboost_system-mt.a
unix: LIBS += /opt/boost_1_61_0/lib/libboost_filesystem-mt.a
unix: LIBS += -L/usr/lib/x86_64-linux-gnu -lz
unix: LIBS += -L/usr/lib/x86_64-linux-gnu -lssl
unix: LIBS += -L/usr/lib/x86_64-linux-gnu -lcrypto

Чтобы boost прилинковался статикой и не требовался на другой машине.

EXL ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.