Библиотека не связана, хотя присутствует в целевых ссылках - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь создать приложение с использованием cmake, но исполняемый файл не может связать с библиотеками, ldd моего исполняемого файла выглядит так

linux-vdso.so.1 (0x00007ffd447a0000)
libavcodec.so.58 => /usr/local/ffmpeg/libavcodec.so.58 (0x00007f5673121000)
libavformat.so.58 => /usr/local/ffmpeg/libavformat.so.58 (0x00007f5672cdb000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f5671ffb000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f5671de3000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f56719f2000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f5671654000)
/lib64/ld-linux-x86-64.so.2 (0x00007f567629b000)
libswresample.so.3 => not found
libavutil.so.56 => not found
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f5671435000)
libavutil.so.56 => not found
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5671231000)

пока у меня в make --trace библиотека присутствует

/usr/bin/c++   -I/home/arunabh-compute/sensor-drivers -isystem 
/usr/local/include -isystem /usr/local/GenICam/include  -Wall -O3   - 
std=gnu++14 -o CMakeFiles/save_cpp.dir/stdafx.cpp.o -c /home/arunabh- 
compute/sensor-drivers/stdafx.cpp
CMakeFiles/save_cpp.dir/build.make:178: update target 'save_cpp' due 
to: CMakeFiles/save_cpp.dir/link.txt 
CMakeFiles/save_cpp.dir/Cpp_Save.cpp.o 
CMakeFiles/save_cpp.dir/stdafx.cpp.o 
CMakeFiles/save_cpp.dir/build.make /usr/local/ffmpeg/libavcodec.so 
/usr/local/ffmpeg/libavcodec.so.58 
/usr/local/ffmpeg/libavcodec.so.58.18.100 
/usr/local/ffmpeg/libavdevice.so /usr/local/ffmpeg/libavdevice.so.58 
/usr/local/ffmpeg/libavdevice.so.58.3.100 
/usr/local/ffmpeg/libavfilter.so /usr/local/ffmpeg/libavfilter.so.7 
/usr/local/ffmpeg/libavfilter.so.7.16.100 
/usr/local/ffmpeg/libavformat.so /usr/local/ffmpeg/libavformat.so.58 
/usr/local/ffmpeg/libavformat.so.58.12.100 
/usr/local/ffmpeg/libavutil.so /usr/local/ffmpeg/libavutil.so.56 
/usr/local/ffmpeg/libavutil.so.56.14.100 
/usr/local/ffmpeg/libswresample.so 
/usr/local/ffmpeg/libswresample.so.3 
/usr/local/ffmpeg/libswresample.so.3.1.100 
/usr/local/ffmpeg/libswscale.so /usr/local/ffmpeg/libswscale.so.5 
/usr/local/ffmpeg/libswscale.so.5.1.100 

, хотя libswresample.so.3, libavutil.so.56 явно присутствует в make - трассировке, приложение по какой-то причине не ссылается на него, кроме того, если я добавлю / usr Папка / local / ffmpeg в моем LD_LIBRARY_PATH все начинает работать просто отлично. Дополнительно libavcodec.so.58 найдено. Попытка понять, что происходит и как это исправить. Спасибо.

1 Ответ

0 голосов
/ 20 марта 2019

Связываясь с этими библиотеками, вы помечали их как необходимые в вашем двоичном файле без записи путей.

По умолчанию ваша система ищет динамические библиотеки только в нескольких местах.У вас есть несколько вариантов:

  • Добавить /usr/local/ffmpeg к файлу в /etc/ld.so.conf.d/ (не забудьте позвонить ldconfig).Это скажет вашему динамическому компоновщику (ld.so) искать там.
  • Добавьте /usr/local/ffmpeg к переменной окружения LD_LIBRARY_PATH, как вы это сделали.Вы можете сделать это постоянным, отредактировав /etc/environment на некоторых машинах.Это имеет тот же эффект, но может быть отменено пользователями.Например, большинство игр в Linux полагаются на это при поиске связанных библиотек, но для этого необходим скрипт запуска.
  • Свяжите свой бинарный файл с -rpath=/usr/local/ffmpeg.Это сообщает динамическому компоновщику, что вы хотели бы, чтобы он тоже там смотрел.Вы можете сделать это в CMake, установив целевое свойство INSTALL_RPATH.Возможно, вы также захотите установить BUILD_WITH_INSTALL_RPATH, поэтому вам не нужно устанавливать LD_LIBRARY_PATH во время разработки или устанавливать отдельную BUILD_RPATH.
  • Наконец, вы можете просто переместить библиотеки ffmpeg в каталог впуть поиска по умолчанию.Однако это может конфликтовать с системными библиотеками и требует root-доступа.Это скорее прибегает в крайнем случае или удобство ко всему.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...