Intereting Posts
Как разыменовать указатель на функцию и читать как данные в MSVC ++? Обмен памятью между процессами с помощью mmap () Поддержка мультимедиа в WPF без Windows Media Player 10+? Django, Nginx, проблема с кешированием FastCGI при изменении кода OpenSSL :: SSL :: SSLError: SSL_connect возвращен = 1 errno = 0 состояние = неизвестно состояние: неизвестный протокол Nginx не передает ответ обновления веб-памяти обратно клиенту? Как заставить Clang Static Analyzer выводить свою работу из командной строки? Относительные пути для активов в Play Framework Демон Linux и STDIN / STDOUT Где linux хранит мой syslog? Почему функция isnumber () присутствует в некоторых дистрибутивах Unix, но не в других? Как создать однопользовательское приложение Qt в Windows? Обновляется ли сертификат SSL для повторного выдачи сертификата? Как обнаружить программный код, когда значок «Установить обновления и выключить компьютер» находится поверх кнопки «Старт /« Выключить »? Как Inno Setup скрывает команду «pin» в меню «Панель задач»

Ссылка на libusb на Ubuntu не работает

Мы пытаемся скомпилировать некоторый код в поле Ubuntu, для которого требуется libusb, но мы продолжаем получать ошибки «неопределенной ссылки на», когда он пытается связать с ним.

Этот код является следующим: https://gitorious.org/minibox-dcdcusb/minibox-dcdcusb

Для этого требуется libusb, поэтому я устанавливаю это:

apt-get install libusb libusb-dev 

Затем я запускаю make и получаю следующие ошибки:

 ➜ minibox-dcdcusb git:(master) ✗ make cc -Wall main.c -o dcdc-usb `pkg-config --libs libusb` -lm -L. -ldcdc-usb ./libdcdc-usb.so: undefined reference to `usb_get_driver_np' ./libdcdc-usb.so: undefined reference to `usb_interrupt_read' ./libdcdc-usb.so: undefined reference to `usb_find_busses' ./libdcdc-usb.so: undefined reference to `usb_find_devices' ./libdcdc-usb.so: undefined reference to `usb_set_configuration' ./libdcdc-usb.so: undefined reference to `usb_interrupt_write' ./libdcdc-usb.so: undefined reference to `usb_control_msg' ./libdcdc-usb.so: undefined reference to `usb_set_altinterface' ./libdcdc-usb.so: undefined reference to `usb_init' ./libdcdc-usb.so: undefined reference to `usb_set_debug' ./libdcdc-usb.so: undefined reference to `usb_open' ./libdcdc-usb.so: undefined reference to `usb_claim_interface' ./libdcdc-usb.so: undefined reference to `usb_detach_kernel_driver_np' ./libdcdc-usb.so: undefined reference to `floor' ./libdcdc-usb.so: undefined reference to `usb_get_busses' collect2: error: ld returned 1 exit status make: *** [dcdc-usb] Error 1 

Я проверил, что pkg-config сообщает о соответствующих параметрах конфигурации:

 ➜ minibox-dcdcusb git:(master) ✗ pkg-config --libs libusb -lusb 

И я убедился, что двоичные файлы – это то место, где они должны быть:

 ➜ minibox-dcdcusb git:(master) ✗ ls -l /usr/lib/x86_64-linux-gnu/libusb* lrwxrwxrwx 1 root root 37 des 3 13:58 /usr/lib/x86_64-linux-gnu/libusb-0.1.so.4 -> /lib/x86_64-linux-gnu/libusb-0.1.so.4 -rw-r--r-- 1 root root 42998 des 3 13:58 /usr/lib/x86_64-linux-gnu/libusb.a lrwxrwxrwx 1 root root 41 des 3 13:58 /usr/lib/x86_64-linux-gnu/libusb.so -> /lib/x86_64-linux-gnu/libusb-0.1.so.4.4.4 

И я даже убедился, что ссылки, на которые, похоже, жалуются компоновщики, действительно находятся в двоичных файлах libusb:

  • http://pastie.org/9156632
  • http://pastie.org/9156633

(спойлер: все символы, на которые жалуется компоновщик, похоже, есть)

Наконец, я запустил команду компиляции с помощью -Wl, – verbose, чтобы точно увидеть, какие бинарные файлы собирал компоновщик, и кажется, что он фактически собирает правильные двоичные файлы, но он просто не может ссылаться на них. Вот результат этого:

  • http://pastie.org/9156644

Я совершенно потерял то, что может быть проблемой здесь? Почему линкер не может ссылаться на libusb?

Почему линкер не может ссылаться на libusb?

Он может, но когда компоновщик видит эту библиотеку, у нее нет никаких неопределенных ссылок на символы в libusb, поэтому он просто перемещается и игнорирует его. Позже компоновщик видит libdcdc-usb, у которого неопределенные ссылки на символы в libusb, но уже слишком поздно, компоновщик уже закрыл libusb и прекратил смотреть на него.

Как отмечается в комментарии, порядок аргументов компоновщика имеет значение, но в комментарии предлагается переместить их раньше, что неверно.

На самом деле я где-то читал, что информация компоновщика должна появиться после аргумента источника, требующего этой библиотеки.

Это не просто «аргументы компоновщика после исходных файлов», вам нужно заказать библиотеки, чтобы библиотеки, предоставляющие описания символов, приходили после объектов, которые нуждаются в этих определениях.

libdcdc-usb зависит от libusb поэтому libusb должен появиться позже , поэтому переместите вызов pkg-config в конец.