Как скомпилировать с помощью -lusb

#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 ?