tin*_*ers 2 c c++ makefile cmake libusb
我是 C/C++ 新手,正在尝试在 Ubuntu 机器(Trusty Tahr)上本地构建和运行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
Run Code Online (Sandbox Code Playgroud)
但运行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'
...
Run Code Online (Sandbox Code Playgroud)
如果我检查/usr/includes/,我会看到 libusb:
meowmeow@kittytown:~/code/ttwatch$ ls /usr/include/libusb-1.0/libusb.h
/usr/include/libusb-1.0/libusb.h
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
该文件ttwatch/includes/libttwatch.h包含 libusb as #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
Run Code Online (Sandbox Code Playgroud)
并且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
Run Code Online (Sandbox Code Playgroud)
我尝试卸载 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.
Run Code Online (Sandbox Code Playgroud)
我不知道 Debian 有软件包libusb-dev和
libusb-1.0-dev. 从包信息中我无法判断为什么同一个库有 2 个包,也许libusb-dev是具有不同 API 的旧版本,而其他包可能仍将其作为依赖项。因此,删除软件包可能不是一个好主意,除非您不关心/不需要依赖于 的软件包libusb-dev,在这种情况下您可以这样做apt-get purge
libusb-dev && apt-get autoremove。请注意,这可能会卸载您需要的软件包。因此,只有当您知道自己在做什么时才这样做。
我没想到 Debian 允许您同时安装这两个软件包,但如果两个库的 API 不同并且彼此不冲突,则可能会出现这种情况。
这似乎令人困惑cmake,当两个库同时安装时,它无法处理。我浏览了问题页面,但没有找到与此相关的问题。因此,如果您无法构建它,我建议您转到问题页面,如果您没有 github 帐户,请创建一个帐户并留下有关
同时安装libusb-dev和时构建包的错误报告libusb-1.0-dev。
cmake_modules/FindLibUSB.cmake另一种选择是在执行此操作之前对文件进行小修改
$ mkdir build && cd build
$ cmake ..
Run Code Online (Sandbox Code Playgroud)
找到该行find_library(LIBUSB_1_LIBRARY,在当前稳定版本上是第62行。下一行是NAMES
,下一行是usb-1.0 usb。从中删除usb,以便
find_library仅搜索libusb-1.0. 保存文件然后你就可以做
$ mkdir build && cd build
$ cmake ..
Run Code Online (Sandbox Code Playgroud)
这应该可以解决问题。