Связывание libusb в Mac OS X

У меня есть очень простой фрагмент кода, который я пытаюсь скомпилировать. Я новичок в GCC из командной строки, поэтому, пожалуйста, простите меня. Я пробовал довольно много разных вещей с GCC, но я все еще не могу его скомпилировать. У меня установлена ​​libusb. Как я могу заставить этот фрагмент кода скомпилироваться?

Библиотека:

anything:usb mymac$ brew list libusb
/usr/local/Cellar/libusb/1.0.9/include/libusb-1.0/libusb.h
/usr/local/Cellar/libusb/1.0.9/lib/libusb-1.0.0.dylib
/usr/local/Cellar/libusb/1.0.9/lib/pkgconfig/libusb-1.0.pc
/usr/local/Cellar/libusb/1.0.9/lib/ (2 other files)
anything:usb mymac$

Попытки GCC (все неудачные):

gcc -o xout usbtest.c
gcc -o xout usbtest.c -lusb-1.0
gcc -L/usr/local/Cellar/libusb/1.0.9/lib -o xout usbtest.c -lusb-1.0

Ошибка для всех попыток:

usbtest.c:3:10: fatal error: 'libusb.h' file not found
#include <libusb.h>

Код:

#include <stdio.h>
#include <stdlib.h>
#include <libusb.h>

int main(int argc, const char * argv[])
{
    libusb_device **devs;
    libusb_context *context = NULL;

    size_t list;
    //size_t i;
    int ret;

    ret = libusb_init(&context);

    if(ret < 0)
    {
        perror("libusb_init");
        exit(1);
    }

    list = libusb_get_device_list(context, &devs);

    printf("There are %zd devices found\n", list);

    return 0;
}

person Community    schedule 06.12.2013    source источник
comment
Не могли бы вы включить полный вывод GCC в каждом случае, чтобы мы могли видеть сообщения об ошибках? Сообщения об ошибках подобны большим подсказкам, которые говорят вам, как решить проблему. Что ж, не беспокойтесь о первом вызове GCC, потому что это никак не сработает.   -  person David Grayson    schedule 06.12.2013
comment
@DavidGrayson извините за это.   -  person    schedule 06.12.2013


Ответы (2)


Вы не говорите gcc, где искать заголовочные файлы. Это делается опцией -I в командной строке gcc для компиляции.

e.g.

gcc -I /usr/local/include -o xout usbtest.c

Я думаю, что Homebrew предоставляет символическую ссылку изнутри подвала на /usr/local

person mmmmmm    schedule 06.12.2013
comment
Скорее всего, ему также потребуется настроить свой #include, если он укажет только на включаемый каталог: #include <libusb-1.0/libusb.h>. - person John Szakmeister; 06.12.2013
comment
@Mark Это решило проблему с отсутствующим файлом. Спасибо. Кстати... Вот созданная доморощенная ссылка: lrwxr-xr-x 1 kyle admin 41 Dec 5 22:38 libusb-1.0 -> ../Cellar/libusb/1.0.9/include/libusb-1.0 - person ; 06.12.2013
comment
@KyleRogers, в каком каталоге это было? - person mmmmmm; 06.12.2013
comment
@Отметить /usr/local/include - person ; 06.12.2013
comment
@Mark, теперь я получаю другую ошибку. Какие-нибудь мысли? Undefined symbols for architecture x86_64: "_libusb_get_device_list", referenced from: _main in usbtest-7VJQQT.o "_libusb_init", referenced from: _main in usbtest-7VJQQT.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) - person ; 06.12.2013
comment
@Mark Я знаю, что этот код работает и действителен, потому что он работает с XCode. Я просто пытаюсь узнать немного больше об использовании gcc и командной строки. - person ; 06.12.2013
comment
Что ж, Xcode и т. д. использует clang, а не gcc, но это не имеет значения, поскольку для этого нам нужно увидеть ваш make-файл или что-то еще, что вы используете для объединения результатов, — есть причина, по которой Xcode значительно упрощает жизнь. - person mmmmmm; 06.12.2013
comment
Проблема с неопределенными символами также связана с путем; только путь к библиотеке (-L) вместо пути включения (-I). - person geowar; 22.10.2017

Итак, у меня была аналогичная проблема, по какой-то причине gcc не включает /usr/local/lib в свой путь поиска по умолчанию в OS X. Быстрое исправление состоит в том, чтобы добавить:

-lusb-1.0

к командам gcc, и он должен скомпилироваться.

person Brandon    schedule 06.01.2014