[РЕШЕНО] Подключение библиотеки libusb

Модератор: Модераторы разделов

Аватара пользователя
devilr
Сообщения: 3000
ОС: Mandriva => Gentoo (~amd64)

[РЕШЕНО] Подключение библиотеки libusb

Сообщение devilr »

Доброго времени суток!
Имеется относительно старый проект на Qt, для управления самосборной платы по USB.
Проект изначально планировался использоваться только на linux, поэтому особых изысков не предполагалось - обычные команды, сама библиотека штатная, установлена обычно, проблем нет.
Теперь понадобилось использовать это проект под windows.
Вроде всё просто - создал в корне проекта каталог lib, добавил туда скачанный файл libusb-1.0.a (вроде как static, если верить описанию), добавил в секцию win32 .pro файла строку

Код: Выделить всё

LIBS += -L$$PWD/lib/libusb-1.0.a
и начал пересобирать проект. Саму библиотеку в системные каталоги класть не стал по некоторым соображениям. Да и прав нет.
Получил 9 однотипных ошибок
undefined reference to `__imp_SetupDiGetClassDevsA'
и подобных, указывающих на функции, которые как раз и находятся в libusb-1.0.a
Что я сделал не так?
P.S. Если важно - используется MinGW
Последний раз редактировалось devilr 02.09.2020 22:51, всего редактировалось 1 раз.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 18294
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Подключение библиотеки libusb

Сообщение Bizdelnick »

-L — это путь для поиска библиотек. Надо -l с именем библиотеки (без пути и суффикса) или просто полный путь к библиотеке. Ну и переменную PWD я бы использовать не стал.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
devilr
Сообщения: 3000
ОС: Mandriva => Gentoo (~amd64)

Re: Подключение библиотеки libusb

Сообщение devilr »

Bizdelnick писал:
02.09.2020 18:29
переменную PWD я бы использовать не стал
Так она используется в том же pro-файле. Ну и в Makefile видно, что путь разворачивается правильно.
-L я пробовал - ошибки те же. Тут что-то другое...
P.S. А вот попробовать отдельно задать путь и отдельно саму библиотеку я как раз и не пробовал. Попробую чуть позже.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 18294
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Подключение библиотеки libusb

Сообщение Bizdelnick »

devilr писал(а):
02.09.2020 19:36
Так она используется в том же pro-файле.
Ну и зря. Но к сабжу это отношения не имеет.
devilr писал(а):
02.09.2020 19:36
-L я пробовал - ошибки те же.
В смысле? Ошибка у Вас как раз в том, что Вы используете -L (неправильно). Попробуйте так:

Код: Выделить всё

LIBS += -L$$PWD/lib -lusb-1.0
Или так:

Код: Выделить всё

LIBS += $$PWD/lib/libusb-1.0.a
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
devilr
Сообщения: 3000
ОС: Mandriva => Gentoo (~amd64)

Re: Подключение библиотеки libusb

Сообщение devilr »

Не работают оба варианта. Кстати, насколько я помню, правильнее писать -lusb-1.0
Но всё равно не работает. Может винде надо как-то показывать, где именно лежат эти функции и каковы их заголовки?
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Спасибо сказали:

Аватара пользователя
ormorph
Сообщения: 1664
ОС: Gentoo

Re: Подключение библиотеки libusb

Сообщение ormorph »

Скорее всего версии компиляторов разные, при переходе на некоторые версии менялся ABI.
Как вариант можно самому собрать libusb, используя туже версию компилятора, можно собрать и под Linux, так как вы джентушник можете использовать crossdev.
Ну и нужно еще глянуть каким компилятором собираете 32 или 64 бита, проект qt.
Спасибо сказали:

Аватара пользователя
devilr
Сообщения: 3000
ОС: Mandriva => Gentoo (~amd64)

Re: Подключение библиотеки libusb

Сообщение devilr »

ormorph писал(а):
02.09.2020 20:53
Скорее всего версии компиляторов разные, при переходе на некоторые версии менялся ABI.
Так а при линковке со статической библиотекой, не всё ли равно, какой компилятор? Библиотека ведь может быть собрана 100500 лет назад. Или я что-то просто не знаю?
ormorph писал(а):
02.09.2020 20:53
Как вариант можно самому собрать libusb
Собрать то можно, просто хотелось попробовать именно со сторонней библиотекой.
ormorph писал(а):
02.09.2020 20:53
Ну и нужно еще глянуть каким компилятором собираете 32 или 64 бита, проект qt.
Разрядность компилятора и библиотеки точно совпадают.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Спасибо сказали:

Аватара пользователя
ormorph
Сообщения: 1664
ОС: Gentoo

Re: Подключение библиотеки libusb

Сообщение ormorph »

Кстати, в проекте строчка:

Shell

QMAKE_LFLAGS += -static
присутствует?
Для динамической сборки нужны .dll библиотеки. Либо прописывать прямой путь к библиотеке включая ее имя вместе с исходниками, но в Qt не уверен что в проекте это будет легко проделать, надо пробовать.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 18294
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Подключение библиотеки libusb

Сообщение Bizdelnick »

devilr писал(а):
02.09.2020 20:15
Кстати, насколько я помню, правильнее писать -lusb-1.0
Да, Вы правы. Затупил.
devilr писал(а):
02.09.2020 20:15
Но всё равно не работает.
Возможно, там всё должно быть ну совсем не так. Я не силён в qmake, а тут ещё и винда…
Покажите лог сборки, хотя бы начиная с команды, которая выдаёт ошибку.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 18294
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Подключение библиотеки libusb

Сообщение Bizdelnick »

ormorph писал(а):
02.09.2020 21:15
Кстати, в проекте строчка:

Shell

QMAKE_LFLAGS += -static
присутствует?
Это не о том. Эта опция говорит не использовать никаких разделяемых библиотек вообще. Есть подозрение, что с ней и подавно ничего не соберётся.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
devilr
Сообщения: 3000
ОС: Mandriva => Gentoo (~amd64)

Re: Подключение библиотеки libusb

Сообщение devilr »

Bizdelnick писал:
02.09.2020 22:11
Покажите лог сборки, хотя бы начиная с команды, которая выдаёт ошибку.
Да там проблема то при линковке, а не сборке. Впрочем, вот
X:/my_programm/tests/Test_libUSB/obj/hid.o:hid.c:(.text+0x379): undefined reference to `__imp_SetupDiGetClassDevsA'
X:/my_programm/tests/Test_libUSB/obj/hid.o:hid.c:(.text+0x388): undefined reference to `__imp_SetupDiEnumDeviceInfo'
X:/my_programm/tests/Test_libUSB/obj/hid.o:hid.c:(.text+0x392): undefined reference to `__imp_SetupDiGetDeviceRegistryPropertyA'
X:/my_programm/tests/Test_libUSB/obj/hid.o:hid.c:(.text+0x3e5): undefined reference to `__imp_SetupDiEnumDeviceInterfaces'
X:/my_programm/tests/Test_libUSB/obj/hid.o:hid.c:(.text+0x415): undefined reference to `__imp_SetupDiGetDeviceInterfaceDetailA'
X:/my_programm/tests/Test_libUSB/obj/hid.o:hid.c:(.text+0x453): undefined reference to `__imp_SetupDiGetDeviceInterfaceDetailA'
X:/my_programm/tests/Test_libUSB/obj/hid.o:hid.c:(.text+0x595): undefined reference to `__imp_SetupDiDestroyDeviceInfoList'
collect2.exe: error: ld returned 1 exit status
mingw32-make: *** [Makefile:208: c:/Programming/my_programm_bin/Test_libUSB.exe] Error 1
mingw32-make: *** Waiting for unfinished jobs....
Project MESSAGE: Qt5 = core gui network widgets
22:14:08: Процесс «C:\Qt\Tools\mingw810_64\bin\mingw32-make.exe» завершился с кодом 2.
Ошибка при сборке/развёртывании проекта Test_libUSB (комплект: Desktop Qt 5.15.0 MinGW 64-bit)
Во время выполнения этапа «Сборка»
Добавлено (22:18):
Bizdelnick писал:
02.09.2020 22:13
Есть подозрение, что с ней и подавно ничего не соберётся.
Ошибки будут те же, я проверил. Чисто для спокойствия. :)
Добавлено (22:19):
Проект чуток другой, но ошибки те же. Просто попробовал обрезать лишнее - полный проект уж больно долго на виртуалке собирается...
И да, в linux собирается нормально.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 18294
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Подключение библиотеки libusb

Сообщение Bizdelnick »

Да, ещё момент: порядок аргументов линковщика, скорее всего, важен. Сначала должны идти объектники (и статические библиотеки), ссылающиеся на символ из библиотеки, и только потом сама эта библиотека. Шибко умные линковщики умеют работать независимо от порядка аргументов (ценой жора памяти и тормозов), но и то, вроде бы, только в случае разделяемых библиотек.
Добавлено (22:22):
devilr писал(а):
02.09.2020 22:17
Да там проблема то при линковке, а не сборке.
Я вижу. Под сборкой понимаю весь процесс.
Команду линковки покажите, самое интересное в ней (аргументы и их порядок).
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
devilr
Сообщения: 3000
ОС: Mandriva => Gentoo (~amd64)

Re: Подключение библиотеки libusb

Сообщение devilr »

Bizdelnick писал:
02.09.2020 22:20
Сначала должны идти объектники (и статические библиотеки), ссылающиеся на символ из библиотеки, и только потом сама эта библиотека.
Ух. И как этим управлять? Да и странно как-то, не находите?
Добавлено (22:24):
Bizdelnick писал:
02.09.2020 22:20
Команду линковки покажите, самое интересное в ней (аргументы и их порядок).
Может проще Makefile прикрепить? Или вы не об этом?
Добавлено (22:50):
Решением оказалось

Код: Выделить всё

LIBS += -lsetupapi
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Спасибо сказали:

Аватара пользователя
ormorph
Сообщения: 1664
ОС: Gentoo

Re: Подключение библиотеки libusb

Сообщение ormorph »

Bizdelnick писал:
02.09.2020 22:13
Эта опция говорит не использовать никаких разделяемых библиотек вообще. Есть подозрение, что с ней и подавно ничего не соберётся.
И такое может быть, если отсутствуют статические библиотеки QT, либо еще чего. Но без этой опции, опция -lusb-1.0 будет искать .dll библиотеку, а не .a.
Как вариант можно прописать:

Shell

QMAKE_LFLAGS += путь/libusb-1.0.a
Спасибо сказали:

Аватара пользователя
devilr
Сообщения: 3000
ОС: Mandriva => Gentoo (~amd64)

Re: [РЕШЕНО] Подключение библиотеки libusb

Сообщение devilr »

ormorph писал(а):
02.09.2020 22:51
И такое может быть, если отсутствуют статические библиотеки QT,
Так они и отсутствуют. Никто пока и не собирался линковать Qt статически. Да и дорого это.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 18294
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: [РЕШЕНО] Подключение библиотеки libusb

Сообщение Bizdelnick »

devilr писал(а):
02.09.2020 22:22
И как этим управлять? Да и странно как-то, не находите?
Нормально. Управлять путём прописывания библиотек в правильном порядке (объектники qmake сам должен в начало воткнуть, по идее).
Бывают грабли, когда много лет проект нормально линковался gold'ом, а потом потребовалось собраться под какую-нибудь систему с менее продвинутым линковщиком, и вылезает вот такое.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 3724
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Подключение библиотеки libusb

Сообщение Hephaestus »

devilr писал(а):
02.09.2020 22:22
Ух. И как этим управлять?
Обыкновенно.
Если речь о Makefile, то в каком порядке укажете ключи в команде, в таком они и будут.
Если Makefile генерируется более сложной системой, то в настройках этой системы указываются параметры линковщика, опять-таки, в каком порядке укажете, в таком и будут.
А вот если какой-то ключ не указать, и он подставится системой сборки, скажем так, неявно, то может оказаться и в неправильном месте, например, в начале команды (до объектных файлов), а не в конце. Точный пример сейчас не могу привести, но сталкивался с таким.
devilr писал(а):
02.09.2020 22:22
Да и странно как-то, не находите?
Ничего странного.
Кроме всего прочего, библиотеки могут зависеть друг от друга. Поэтому и порядок может быть важен.
devilr писал(а):
02.09.2020 22:22
Может проще Makefile прикрепить?
Прикрепите, посмотрим.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Аватара пользователя
devilr
Сообщения: 3000
ОС: Mandriva => Gentoo (~amd64)

Re: [РЕШЕНО] Подключение библиотеки libusb

Сообщение devilr »

Hephaestus писал:
02.09.2020 23:02
Прикрепите, посмотрим.
Так я уже решил проблему. И даже первый пост отредактировал. :)
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 18294
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: [РЕШЕНО] Подключение библиотеки libusb

Сообщение Bizdelnick »

ormorph писал(а):
02.09.2020 22:51
Но без этой опции, опция -lusb-1.0 будет искать .dll библиотеку, а не .a.
Нет. По умолчанию будет искать сначала .dll, а если не найдёт — .a. Для управления линковкой отдельных библиотек есть ещё опции -Bstatic и -Bdynamic, но это на случай, когда присутствуют и разделяемая, и статическая библиотека с тем же именем, и поведение по умолчанию не устраивает.
Offtopic
На самом деле всё ещё более запутано, потому что опции gcc не точно соответствуют опциям ld (у gcc -static означает, что надо собрать статический бинарник, а у ld это синоним -Bstatic; кроме того, хоть актуальные версии gcc и передают линковщику -Bstatic и -Bdynamic, правильнее их указывать как -Wl,-Bstatic и -Wl,-Bdynamic).
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
ormorph
Сообщения: 1664
ОС: Gentoo

Re: [РЕШЕНО] Подключение библиотеки libusb

Сообщение ormorph »

Bizdelnick писал:
02.09.2020 23:14
Для управления линковкой отдельных библиотек есть ещё опции -Bstatic и -Bdynamic, но это на случай, когда присутствуют и разделяемая, и статическая библиотека с тем же именем, и поведение по умолчанию не устраивает.
Да баловался я когда то этими флагами, но они работают только на 64 битной версии mingw.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 18294
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: [РЕШЕНО] Подключение библиотеки libusb

Сообщение Bizdelnick »

ormorph писал(а):
02.09.2020 23:40
они работают только на 64 битной версии mingw
В сортах mingw не силён, но, скорее всего, дело в том, о чём я писал выше (надо их использовать с опцией -Wl). Впрочем, к сабжу это касательства не имеет.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
devilr
Сообщения: 3000
ОС: Mandriva => Gentoo (~amd64)

Re: [РЕШЕНО] Подключение библиотеки libusb

Сообщение devilr »

Смотрю, обсуждение стихийно продолжается. :)
Кто в теме, а что за библиотеки "*.a"? Раньше вроде было только dll и lib. Или у меня опять криокамера заклинила?
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Спасибо сказали:

Аватара пользователя
ormorph
Сообщения: 1664
ОС: Gentoo

Re: [РЕШЕНО] Подключение библиотеки libusb

Сообщение ormorph »

devilr писал(а):
02.09.2020 23:58
Кто в теме, а что за библиотеки "*.a"?
Архив с объектными файлами. Оно же статическая библиотека.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 18294
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: [РЕШЕНО] Подключение библиотеки libusb

Сообщение Bizdelnick »

devilr писал(а):
02.09.2020 23:58
Кто в теме, а что за библиотеки "*.a"? Раньше вроде было только dll и lib. Или у меня опять криокамера заклинила?
Плохо помню и боюсь соврать, но, вроде бы, .lib — это формат линковщика от M$, а GNU ld использует .a на всех платформах. Там есть ещё какие-то тонкости вроде .lib, прилагающегося к .dll, но об этом не хочу даже пытаться вспоминать.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
ormorph
Сообщения: 1664
ОС: Gentoo

Re: [РЕШЕНО] Подключение библиотеки libusb

Сообщение ormorph »

Bizdelnick писал:
02.09.2020 23:54
В сортах mingw не силён, но, скорее всего, дело в том, о чём я писал выше (надо их использовать с опцией -Wl).
Уж и не упомнишь, хотя возможно я перепутал с опцией -static-libstdc++, оно точно работает только на 64 битах.
Спасибо сказали: