#c #linux
#c #linux
Вопрос:
Кто-нибудь может мне помочь, как скомпилировать приведенный ниже код. Они говорят «компилировать с помощью -lusb». Я не знаю, как это сделать. простите мою глупость:D
#include <stdio.h>
#include <usb.h>
main(){
struct usb_bus *bus;
struct usb_device *dev;
usb_init();
usb_find_busses();
usb_find_devices();
for (bus = usb_busses; bus; bus = bus->next)
for (dev = bus->devices; dev; dev = dev->next){
printf("Trying device %s/%sn", bus->dirname, dev->filename);
printf("tID_VENDOR = 0xxn", dev->descriptor.idVendor);
printf("tID_PRODUCT = 0xxn", dev->descriptor.idProduct);
}
}
Комментарии:
1.
They say "compile with -lusb".
На самом деле библиотека не нужна для успешной компиляции, но заголовочные файлы необходимы. Для успешной компоновки требуется библиотека.2. Не имеет отношения к вашей проблеме, но вы должны использовать
int main(void)
, а неmain()
.
Ответ №1:
Я смог успешно скомпилировать и запустить вашу программу.
Во-первых, есть три вещи, о которых вы должны знать -lusb
.
-
Означает, что это опция для компилятора, в моем случае я используюgcc
.l
Эти префиксыusb
означают, что это внешняя библиотека, которую мы включаем в нашу компиляцию этой программы.usb
— это имя библиотеки, и оно связано с#include <usb.h>
(usb — это usb.h, исключая его суффикс)
Команда, которую я использовал:
gcc usb.c -o usb -lusb
Я использую gcc 4.7.3
и libusb 1.0.18
Редактировать: Правильно укажите -lusb после файла исходного кода.
Комментарии:
1. При запуске вашей команды я получу сообщение об ошибке привязки. Я считаю, что вам следует что-то заменить.
2. у меня все еще есть проблема при компиляции. это говорит (libusb.h: нет такого файла или каталога). Я уже загрузил libusb следующим образом «sudo apt-get install libusb-1.0-0- dev» можете ли вы дать мне какое-либо предложение. @NuclearPeon
3. @пользователь3513915, попробуй
sudo apt-get install libusb-dev
.4. @user3513915, или явно указать путь
-I/usr/include/libusb-1.0
.5. Я считаю, что
-lusb
аргумент должен следовать заusb.c
аргументом, чтобы неразрешенные символы вusb.c
(фактически в сгенерированномusb.o
) могли быть разрешеныlibusb
библиотекой. Между прочим, нет необходимой корреляции между<usb.h>
именем заголовка и-lusb
именем библиотеки; это соглашение.
Ответ №2:
Вам нужно добавить -lusb
в вашу команду gcc:
gcc -Wall -o usb usb.c -lusb
Комментарии:
1. О чем вы говорите — в команде нет порядка. Это могло бы быть так же легко
gcc usb.c -Wall -lusb -o usb
.2. Кажется, человек, с которым вы разговаривали, удалил свой комментарий.
3. @DavidC.Rankin В этом есть абсолютный порядок. Для статических библиотек содержащие объектные файлы будут удалены, если в командной строке пока ничего не требуется из архивов. Для разделяемых библиотек дистрибутивы Linux, начиная с нескольких лет, запускают компоновщик с флагом —as-needed , который также удаляет разделяемые библиотеки почти таким же образом.
4. Точка зрения хорошо понята, но ответ был дан в контексте поставленного здесь вопроса с одной библиотекой и без каких-либо дополнительных зависимостей от библиотеки. В случае, когда вы имеете дело со стандартными библиотеками so, которые сами не имеют явных зависимостей от библиотеки, не имеет значения, где
-l<libname>
появляется в командной строке. Если библиотека, которую вы хотите, в свою очередь, зависит от дополнительных библиотек, то да, важно, чтобы зависимости были перечислены после библиотеки, которую вы хотите. Спасибо за разъяснение.5. Действительно? он отлично работает здесь без каких-либо проблем. Установлен ли у вас libusb? В командной строке попробуйте
find /usr/include/usb.h
Это там? Проверьте путь к своей библиотеке. У вас естьlibusb.so
?