Russian Qt Forum
Март 28, 2024, 13:04 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как подключить библиотеку?  (Прочитано 11478 раз)
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« : Июнь 04, 2018, 20:54 »

Linux. собрал программу с библиотекой буст. положил нужную библиотеку рядом с бинарником, запускаю - незапускается.


Код:
pi@raspberrypi:~/GatewayVoda $ ls
a.out     GatewayVoda  gwBoost    libboost_system.a   libboost_system.so.1.66.0  libboost_thread.so         libstdc++.so.6       Logs2  not
echo.php  GatewayWS    index.php  libboost_system.so  libboost_thread.a          libboost_thread.so.1.66.0  libstdc++.so.6.0.22  lora
pi@raspberrypi:~/GatewayVoda $ ldd GatewayVoda
        linux-vdso.so.1 (0x7ef86000)
        /usr/lib/arm-linux-gnueabihf/libarmmem.so (0x76f23000)
        libwiringPi.so => /usr/local/lib/libwiringPi.so (0x76efd000)
        libboost_system.so.1.66.0 => not found
        libboost_thread.so.1.66.0 => not found
        libstdc++.so.6 => /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 (0x76e21000)
        libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0x76da6000)
        libgcc_s.so.1 => /lib/arm-linux-gnueabihf/libgcc_s.so.1 (0x76d78000)
        libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0x76c37000)
        libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0x76c0f000)
        librt.so.1 => /lib/arm-linux-gnueabihf/librt.so.1 (0x76bf8000)
        libcrypt.so.1 => /lib/arm-linux-gnueabihf/libcrypt.so.1 (0x76bb9000)
        /lib/ld-linux-armhf.so.3 (0x54b41000)
pi@raspberrypi:~/GatewayVoda $ ./GatewayVoda
./GatewayVoda: error while loading shared libraries: libboost_system.so.1.66.0: cannot open shared object file: No such file or directory
pi@raspberrypi:~/GatewayVoda $ LD_LIBRARY_PATH='pwd' ./GatewayVoda
./GatewayVoda: error while loading shared libraries: libboost_system.so.1.66.0: cannot open shared object file: No such file or directory
pi@raspberrypi:~/GatewayVoda $

Обычно, если нет библиотеки, то ищется библиотека в текущей папке. Но тут она есть, а программа её не видит. Почему?


Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #1 : Июнь 04, 2018, 21:04 »

Потому что в linux загрузчик никогда не ищет библиотеки в директории с бинарником.
Почитайте man ld.so и про RPATH.
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #2 : Июнь 04, 2018, 22:02 »

Почитайте man ld.so и про RPATH.
Почитал. Проблема осталась.
В 2-х словах: собираю портабл приложение. Я не хочу менять какие-то настройки в системе, приписывать пути, менять конфиги ОС. Во первых не хочу на каждой машине это делать, во вторых конечный пользователь не умеет этого делать. Я хочу распаковать папку с бинарником и всеми нужными либами в одном любом месте, запустить бинарник (или скрипт) и чтоб прога заработала. Скрипт не должен менять в системе пути. Папку с бинарником могут полоджить куда угодно. Можно как-то запустит прогу с сказать линуксу "Запути эту прогу, библиотеки ищи в текущей директории"?

ps статику не предлагать.
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #3 : Июнь 05, 2018, 06:07 »

Добавьте скрипт в котором будет:
export LD_LIBRARY_PATH=<путь к вашим библиотекам>
а после запускайте ваш бинарник.
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #4 : Июнь 05, 2018, 07:21 »

спасибо, сработало. Но раньше просто помещал рядом все библы, всякие бусты и майэскуэли, и работало.

Для юзерских машин годное решение. Для разработчика не очень. Приложение должно запускаться под gdbserver-ом. Тут я так понял без внесение в ОС каких-то переменных и конфигов не прокатит. Как запустить приложение просто бинарником без префиксных команд?
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #5 : Июнь 05, 2018, 09:39 »

Для юзерских машин годное решение. Для разработчика не очень. Приложение должно запускаться под gdbserver-ом. Тут я так понял без внесение в ОС каких-то переменных и конфигов не прокатит. Как запустить приложение просто бинарником без префиксных команд?
Это должно работать и для gdbserver. Эта указание ld.so, разработчик можете добавить эту строку к себе в .bash_profile
Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #6 : Июнь 05, 2018, 09:49 »

Как запустить приложение просто бинарником без префиксных команд?

обычно всегда библиотеки просматриваются и в /usr/local/lib
положи туда свои или сделай линки
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #7 : Июнь 05, 2018, 14:34 »

Это должно работать и для gdbserver. Эта указание ld.so, разработчик можете добавить эту строку к себе в .bash_profile
а как? Работаю в эклипсе. там в настройке дебугера есть строка, в которую можно записать аргументы передаваемые программе. но как эклипсу (или гдб серверу в эклипсе) сказать чтобы библиотеки искались в папке с бинарником?
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #8 : Июнь 05, 2018, 14:39 »

а как? Работаю в эклипсе. там в настройке дебугера есть строка, в которую можно записать аргументы передаваемые программе. но как эклипсу (или гдб серверу в эклипсе) сказать чтобы библиотеки искались в папке с бинарником?
Переменные среды там можно задавать? Вот QtCreator например это есть. Добавьте туда свою переменную LD_LIBRARY_PATH.
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #9 : Июнь 05, 2018, 14:44 »

Переменные среды там можно задавать? Вот QtCreator например это есть. Добавьте туда свою переменную LD_LIBRARY_PATH.
конечно можно... я думаю....... попробую. Спасибо за подсказку!!!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 22.