CMake не может найти внешнюю библиотеку

Я пытаюсь создать приложение, использующее библиотеку LibUSB.

В предыдущем вопросе я задал здесь Мне сказали использовать find_path и find_library, чтобы заставить CMake искать заголовки и двоичные файлы. Однако даже после ручного поиска мест установки библиотеки с помощью dnf и указания их как PATHS или HINTS я всегда получаю сообщение об ошибке:

/usr/bin/ld: cannot find -lUSB
collect2: error: ld returned 1 exit status

Ниже приведен соответствующий cmakelists.txt, моя строка импорта в main.cpp — #include <libusb-1.0/libusb.h>

add_executable(project main.cpp)
find_path(LIBUSB_INCLUDE_DIR
  NAMES libusb.h
  PATHS "/usr/include/"
  PATH_SUFFIXES "include" "libusb")
find_library(LIBUSB_LIBRARY
  NAMES USB
  HINTS "/usr/lib/" "/usr/lib64/" "/usr/include/"
  PATH_SUFFIXES "lib" "lib32" "lib64")

target_include_directories(project PRIVATE "/usr/lib/" "/usr/lib64/")
target_link_libraries(project USB)

Ясно, что я делаю что-то не так в этой куче хаков, но может кто-нибудь сказать мне, что?


person Segfault    schedule 26.01.2016    source источник
comment
Разве вы не должны использовать ${LIBUSB_LIBRARY} где-нибудь?   -  person Biffen    schedule 26.01.2016
comment
Если вы не поняли мой ответ, пожалуйста, помогите улучшить его комментариями к ответу.   -  person usr1234567    schedule 26.01.2016
comment
@usr1234567 usr1234567 Я понял ваш ответ, но подумал, что сейчас задаю другой вопрос   -  person Segfault    schedule 27.01.2016


Ответы (2)


Вы нигде не используете результат своих операций поиска. Вы говорите CMake найти заголовки и сохранить найденные пути в LIBUSB_INCLUDE_DIR, а также найти библиотеку и сохранить ее местоположение в LIBUSB_LIBRARY, а затем вы игнорируете их и вместо этого используете жестко запрограммированные "/usr/lib/" "/usr/lib64/" и USB. Попробуй это:

target_include_directories(project PRIVATE ${LIBUSB_INCLUDE_DIR})
target_link_libraries(project ${LIBUSB_LIBRARY})
person Angew is no longer proud of SO    schedule 26.01.2016
comment
Я попробовал ваше решение, однако моя ошибка изменилась на: /usr/bin/ld: CMakeFiles/botspotptp.dir/main.cpp.o: undefined reference to symbol 'libusb_set_debug' /usr/lib64/libusb-1.0.so.0: error adding symbols: DSO missing from command line collect2: error: ld returned 1 exit status Что такое DSO? - person Segfault; 27.01.2016
comment
@LordNibbler Ты спрашивал дядю Гугла? Возможно, вам следует просмотреть несколько руководств по связыванию вручную, прежде чем CMake вступит в игру. - person Angew is no longer proud of SO; 27.01.2016
comment
Я не понимаю, какое отношение ручное связывание имеет к CMake; кроме того, как любой хороший интернет-гражданин, я тщательно прошерстил Google, прежде чем публиковать здесь. Я нашел ссылку на необходимость pthread, которую я нашел и включил, используя тот же метод, но это не решило и не изменило проблему. - person Segfault; 27.01.2016
comment
@LordNibbler Я предложил это, потому что DSO (динамический общий объект, IIUC) не имеет ничего общего с CMake. И потому что вы говорили о включенных каталогах и заголовках в контексте неразрешенных ссылок. - person Angew is no longer proud of SO; 27.01.2016

Как показано в исходном вопросе, здесь, все функции поиска и включения можно просто заменить на:

target_link_libraries(project_name <other_dependencies> usb-1.0),

в файле, где определена цель сборки.

person Segfault    schedule 29.01.2016