Вопрос или проблема
Я пытаюсь написать программу, которая передает данные на мое устройство. Я использую libusb. У меня возникло много проблем с установкой этого пакета как в 32, так и в 64 битной версии Ubuntu 16 LTS. Команды для установки:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install libusb-1.0-0-dev
sudo apt-get install libusb-1.0-0-dbg
Также пробовал: http://www.linuxfromscratch.org/blfs/view/svn/general/libusb.html
Команда “dpkg -l libusb*” в 64 битной версии Ubuntu показывает, что пакет установлен, тогда как в 32 битной версии объявляется “такого пакета нет…”.
Команда компиляции:
sudo gcc -g -o usbtest usbtest.c -lusb-1.0
В 64 битной версии Ubuntu компиляция прошла успешно, а в 32 битной версии появилась следующая заметка:
/usr/bin/ld: cannot find -lusb-1.0
collect2: error: ld returned 1 exit status
Но я был уверен, что он существует, и затем я попробовал следующую команду, и она скомпилировалась без ошибок.
sudo gcc -g -o usbtest usbtest.c -L/usr/local/lib -lusb-1.0
В конце, когда я запускаю свою программу, она не может найти мое устройство, другими словами, не может открыть устройство. Далее представлена процедура отладки в Ubuntu (32 и 64 бит):
141 int r = 1;
(gdb) s
143 r = libusb_init(NULL);
(gdb)
libusb_init (context=0x0) at ../../libusb/core.c:1983
1983 ../../libusb/core.c: Нет такого файла или каталога.
(gdb)
1985 в ../../libusb/core.c
(gdb)
__GI_getenv (name=0xb7fb2f16 "LIBUSB_DEBUG") at getenv.c:34
34 getenv.c: Нет такого файла или каталога.
(gdb)
__x86.get_pc_thunk.bx () at ../sysdeps/i386/i686/multiarch/../memcmp.S:80
80 ../sysdeps/i386/i686/multiarch/../memcmp.S: Нет такого файла или каталога.
(gdb)
__GI_getenv (name=0xb7fb2f16 "LIBUSB_DEBUG") at getenv.c:35
35 getenv.c: Нет такого файла или каталога.
(gdb)
__strlen_ia32 () at ../sysdeps/i386/i686/multiarch/../../i586/strlen.S:43
43 ../sysdeps/i386/i686/multiarch/../../i586/strlen.S: Нет такого файла или каталога.
(gdb)
44 в ../sysdeps/i386/i686/multiarch/../../i586/strlen.S
У меня нет никаких идей, что мне делать.
Я не совсем уверен, чего вы пытаетесь достичь; вам нужно, чтобы libusb работал как на 32, так и на 64 бит? Или только на одном из них? В любом случае, библиотека должна быть установлена специально для правильной архитектуры. Команда установки по умолчанию будет устанавливать только ее “собственную” версию библиотеки. Вы можете специально указать установить обе версии:
sudo apt-get install libusb-1.0-0-dev:i386
sudo apt-get install libusb-1.0-0-dev:amd64
для 32 и 64 бит соответственно. Вы также можете сразу проверить наличие файлов библиотеки, в моей системе (16.04) они находятся в
32bit: /usr/lib/i386-linux-gnu/
64bit: /usr/lib/x86_64-linux-gnu
(если вы сомневаетесь, dpkg-query -L libusb-1.0-0-dev
показывает, где они установлены.)
Что касается libusb, который вы скомпилировали сами, вам нужно следить за тем, чтобы вы использовали правильную версию при линковке вашей программы. Возможно, вы смешиваете 32 и 64 битные версии в /usr/local/lib? gcc / ld тогда не будет знать, как их разделить.
Что касается сессии отладки, gdb просто пытается показать вам строки исходного кода, но не знает, где найти исходные файлы библиотеки. В остальном я не вижу ничего, что явно идет не так.
Ответ или решение
Ошибка "cannot find – No such file or directory – libusb" на Ubuntu 32 и 64 бита
Если вы сталкиваетесь с увлекательной задачей программирования с использованием libusb
на Ubuntu и при этом по какой-то причине получаете ошибку о том, что библиотека не найдена, вам стоит внимательно рассмотреть несколько аспектов установки и компиляции этой библиотеки.
1. Установка libusb для разных архитектур
Действительно, для успешного выполнения программ на 32-битной и 64-битной версиях Ubuntu необходимо установить соответствующую библиотеку для каждой архитектуры. Команда apt-get
по умолчанию устанавливает версию библиотеки, подходящую для вашей архитектуры, поэтому, если вам нужно обе версии, воспользуйтесь следующими командами:
sudo apt-get install libusb-1.0-0-dev:i386
sudo apt-get install libusb-1.0-0-dev:amd64
Эти команды позволят вам установить библиотеку для 32-разрядной и 64-разрядной архитектур, соответственно. После выполнения этих установок убедитесь, что библиотека установлена корректно, с помощью команды:
dpkg -l | grep libusb
2. Проверка путей библиотек
Как правило, библиотеки libusb
находятся в следующих директориях:
- Для 32-битной версии:
/usr/lib/i386-linux-gnu/
- Для 64-битной версии:
/usr/lib/x86_64-linux-gnu/
Если вы хотите убедиться, где именно установлены файлы, используйте команду:
dpkg-query -L libusb-1.0-0-dev
3. Компиляция программ
При компиляции вашего приложения рекомендуется указывать прямой путь к библиотекам, чтобы избежать путаницы между версиями. Ваш компилятор может не находить 32-битную библиотеку, если она не находится в стандартных путях. Попробуйте явно указать задействованные директории при компиляции:
sudo gcc -g -o usbtest usbtest.c -L/usr/lib/i386-linux-gnu -lusb-1.0
4. Проверка установленной библиотеки
При проверке наличия библиотеки необходимо убедиться, что версии библиотек, используемые при программировании и компиляции, совпадают. Иногда можно случайно смешивать 32-битные и 64-битные версии, что приведет к ошибкам компиляции или при запуске программы.
5. Ошибки во время отладки
Ошибки, которые вы видите при запуске gdb
, могут свидетельствовать о том, что отладчик не может найти исходные файлы библиотеки. Это нормальное поведение, поскольку gdb
пытается обратиться к исходному коду в папках библиотеки, где эти файлы могут быть отсутствуют. Ошибка "No such file or directory" не всегда указывает на наличие проблемы в вашем коде, а скорее всего, это связано с отсутствием исходников на вашей системе.
Чтобы улучшить отладку, вы можете установить исходники libusb
, которые могут вам понадобиться для решения подобного рода задач:
sudo apt-get install libusb-1.0-0-doc
Заключение
Работа с библиотеками, такими как libusb
, может быть сложной, особенно при учете различных архитектур системы. Важно понимать, какая версия библиотеки нужна для вашего окружения, а также корректно указывать пути во время компиляции. Если следовать приведенным шагам и рекомендациям, вы сможете минимизировать риски помилок и добиться желаемого результата. Если проблема сохраняется, рассмотрите возможность получения помощи в сообществах разработчиков или на форумах, посвященных Ubuntu.