CMake / Make找不到libusb

时间:2018-02-04 23:14:14

标签: c++ c makefile cmake libusb

我是C / C ++的新手,我正在尝试在Ubuntu机器(Trusty Tahr)上本地构建和运行来自github的ttwatch。说明包括首先安装一些库:cmake,openssl,curl,libusb,并包含一个注释来安装" -dev"版本(例如libssl-dev,libcurl-dev,libusb-1.0-0-dev)。我在使用libusb时遇到了一些麻烦。我在互联网上看到有关这方面的问题,但尚未找到可行的解决方案。

正常运行cmake .

meowmeow@kittytown:~/code/ttwatch$ cmake .
-- Enabled daemon function
-- Found libusb-1.0:
--  - Includes: /usr/include/libusb-1.0
--  - Libraries: /usr/lib/x86_64-linux-gnu/libusb.so
-- Configuring done
-- Generating done
-- Build files have been written to: /home/meowmeow/code/ttwatch

但是运行make表明libusb未正确定位:

meowmeow@kittytown:~/code/ttwatch$ make
[ 42%] Built target libttbin
[ 42%] Built target libttwatch
[ 42%] Built target ttbincnv
[ 42%] Built target ttbinmod
[ 42%] Built target manifest
Linking CXX executable ttwatch
CMakeFiles/ttwatch.dir/src/ttwatch.c.o: In function `main':
/home/meowmeow/code/ttwatch/src/ttwatch.c:1618: undefined reference to `libusb_init'
/home/meowmeow/code/ttwatch/src/ttwatch.c:1796: undefined reference to `libusb_exit'
...

如果我查看/usr/includes/,我会看到libusb:

meowmeow@kittytown:~/code/ttwatch$ ls /usr/include/libusb-1.0/libusb.h 
/usr/include/libusb-1.0/libusb.h

dpkg显示:

meowmeow@kittytown:~/code/ttwatch$ dpkg -L libusb-1.0-0-dev
/.
/usr
/usr/lib
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/pkgconfig
/usr/lib/x86_64-linux-gnu/pkgconfig/libusb-1.0.pc
/usr/lib/x86_64-linux-gnu/libusb-1.0.a
/usr/share
/usr/share/doc
/usr/share/doc/libusb-1.0-0-dev
/usr/share/doc/libusb-1.0-0-dev/copyright
/usr/include
/usr/include/libusb-1.0
/usr/include/libusb-1.0/libusb.h
/usr/lib/x86_64-linux-gnu/libusb-1.0.so
/usr/share/doc/libusb-1.0-0-dev/README
/usr/share/doc/libusb-1.0-0-dev/changelog.Debian.gz


meowmeow@kittytown:~/code/ttwatch$ dpkg -L libusb-1.0-0
/.
/lib
/lib/x86_64-linux-gnu
/lib/x86_64-linux-gnu/libusb-1.0.so.0.1.0
/usr
/usr/share
/usr/share/doc
/usr/share/doc/libusb-1.0-0
/usr/share/doc/libusb-1.0-0/README
/usr/share/doc/libusb-1.0-0/copyright
/usr/share/doc/libusb-1.0-0/changelog.Debian.gz
/lib/x86_64-linux-gnu/libusb-1.0.so.0

文件ttwatch/includes/libttwatch.h包含libusb #include <libusb.h>,我尝试将其修改为#include <libusb-1.0/libusb.h>,希望能更好地匹配我的/usr/includes/文件,但是没有改变错误输出。

非常感谢任何帮助!

编辑: 使用make VERBOSE=1会显示-lusb,而不是-lusb-1.0:

...
/usr/bin/c++ -g CMakeFiles/ttwatch.dir/src/ttwatch.c.o CMakeFiles/ttwatch.dir/src/log.c.o CMakeFiles/ttwatch.dir/src/options.c.o CMakeFiles/ttwatch.dir/src/json.c.o CMakeFiles/ttwatch.dir/src/download.c.o CMakeFiles/ttwatch.dir/src/firmware.c.o CMakeFiles/ttwatch.dir/src/misc.c.o CMakeFiles/ttwatch.dir/src/get_activities.c.o CMakeFiles/ttwatch.dir/src/update_gps.c.o CMakeFiles/ttwatch.dir/src/set_time.c.o -o ttwatch -rdynamic libttwatch.a libttbin.a -lusb -lssl -lcrypto -lcurl

libusb.so似乎存在:

meowmeow@kittytown:~/code/ttwatch$ dpkg-query -S /usr/lib/x86_64-linux-gnu/libusb.so 
libusb-dev: /usr/lib/x86_64-linux-gnu/libusb.so

我尝试卸载libusb-dev(sudo apt-get remove libusb-dev)并安装了libusb-1.0(sudo apt-get install libusb-1.0)以查看是否可以解决问题。我现在有一个/usr/lib/x86_64-linux-gnu/libusb-1.0.so(请注意1.0),但我现在从make获取此信息:

make[2]: *** No rule to make target /usr/lib/x86_64-linux-gnu/libusb.so', needed by ttwatch'. Stop.

1 个答案:

答案 0 :(得分:2)

我不知道Debian有包libusb-devlibusb-1.0-dev。从包装信息我不知道为什么有2 同一个库的包,也许libusb-dev是旧版本的 不同的API和其他软件包可能仍然将其作为依赖项。所以 除非您不关心/需要,否则取出包装可能不是一个好主意 包取决于libusb-dev,在这种情况下,您可以执行apt-get purge libusb-dev && apt-get autoremove。请确保此可能卸载 你需要的包裹。只有当你知道自己在做什么时才这样做。

我没想到Debian允许你同时安装这两个软件包 时间,但这可能是两个图书馆的API不同而且不是 相互冲突。

这似乎让cmake感到困惑,这两个库都无法处理 同时安装。我已经浏览了issues页面和我 没有发现与此相关的问题。所以,如果你无法建立它, 我建议您转到issue页面,如果您没有github 帐户,创建一个并留下有关构建包的错误报告 libusb-dev同时安装。

另一种选择是在执行

之前对文件cmake_modules/FindLibUSB.cmake进行一些小修改
$ mkdir build && cd build
$ cmake ..

libusb-1.0-dev上找到find_library(LIBUSB_1_LIBRARY行。下一行是NAMES 下一行是usb-1.0 usb。从中删除usb,以便 find_library仅搜索libusb-1.0。保存文件,然后就可以了

$ mkdir build && cd build
$ cmake ..

这应解决问题。