Ошибка компоновщика «Нет такого файла или каталога», LD_LIBRARY_PATH установлен правильно

0

Некоторые предпосылки: я использую встроенную плату (SolidRun Cubox-i4 Pro) и установил Ubuntu 14.04 на нее, используя изображение, полученное на форумах сообщества SolidRun.

У этой конкретной платы есть графический драйвер Vivante GC2000, который рекламирует поддержку OpenCL. Однако драйвер GPU испытывает боль. Я нашел двоичные файлы для всех необходимых библиотек, но когда я пытаюсь запустить небольшой тестовый исполняемый файл, построенный против них, я получаю эту знакомую ошибку:

cubox@cubox:~/cltest$ g++ cltest.cpp -lOpenCL -lGAL
cubox@cubox:~/cltest$ ./a.out 
./a.out: error while loading shared libraries: libOpenCL.so: cannot open shared object file: No such file or directory

Поэтому я дважды проверяю путь к библиотеке:

cubox@cubox:~/cltest$ ls /usr/lib/libOpenCL*   
/usr/lib/libOpenCL.so

И я дважды проверю свою LD_LIBRARY_PATH:

cubox@cubox:~/cltest$ echo $LD_LIBRARY_PATH
/usr/lib

Хорошо, так ясно, что проблема не в том, что она не может найти библиотеку, но что там какая-то несовместимость, и ошибка вводит в заблуждение (я видел это раньше). Поэтому я пробую это:

cubox@cubox:~/cltest$ file /usr/lib/libOpenCL.so 
/usr/lib/libOpenCL.so: ELF 32-bit LSB  shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, not stripped

... и сравните это с тем, что я только что составил:

cubox@cubox:~/cltest$ file a.out 
a.out: ELF 32-bit LSB  executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=fcd06f947198f92f43f364874fcef66a6303e7b4, not stripped

Они выглядят одинаково, за исключением того, что упоминается for GNU/Linux 2.6.32. Затем я вспомнил, что драйвер пришел с некоторыми предварительно скомпилированными тестовыми приложениями, поэтому я запустил один из них:

cubox@cubox:/opt/viv_samples/cl11/fft$ ./fft 
-bash: ./fft: No such file or directory

... и проверил его информацию о file:

cubox@cubox:/opt/viv_samples/cl11/fft$ file fft
fft: ELF 32-bit LSB  executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.31, stripped

Итак, один для GNU/Linux 2.6.32, а другой для GNU/Linux 2.6.31.

Вопросов:

  1. Неужели ничто не выполнит или не найдет библиотеки?
  2. Если да, то каковы мои варианты? Могу ли я заставить их работать как-то?
  3. Есть ли другая команда, которую я могу запустить, чтобы узнать больше о библиотеках?

EDIT в ответ на ответ (ы):

Выход ldd:

cubox@cubox:~/cltest$ ldd a.out 
    libOpenCL.so => not found
    libGAL.so => not found
    libstdc++.so.6 => /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 (0x76ea1000)
    libgcc_s.so.1 => /lib/arm-linux-gnueabihf/libgcc_s.so.1 (0x76e80000)
    libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0x76d99000)
    libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0x76d2c000)
    /lib/ld-linux-armhf.so.3 (0x76f5f000)

Исполняемые разрешения были уже правильными (-rwxrwxr-x для -rwxr-xr-x, -rwxr-xr-x для приложения -rwxr-xr-x).

  • 1
    Возможно, у вас есть проблема, подобная описанной в этом вопросе / ответе: unix.stackexchange.com/questions/76490/…
  • 0
    Может случиться так, что libOpenCL.so найден, но одна из его зависимостей отсутствует, попробуйте запустить ldd на самой libOpenCL.so
Теги:
embedded-linux
shared-libraries
ld

2 ответа

1

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

Кроме того, для запуска программы ему нужен исполняемый бит, который должен быть установлен в разрешениях

$ ls -la fft

$ chmod a + x fft./fft

  • 0
    Система не позволяет мне оставить комментарий к исходному сообщению.
0

Почти наверняка проблема заключается в том, что вы не export LD_LIBRARY_PATH поэтому он устанавливался только в вашей оболочке и не экспортировался в дочерний процесс a.out.

См. LD_LIBRARY_PATH, общий путь к lib в Linux.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню