【发布时间】:2018-02-04 23:14:13
【问题描述】:
我是 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.
【问题讨论】:
-
执行
make VERBOSE=1并检查链接器的实际调用(检查-l、-L标志等)。CMakeLists.txt可能会添加-lusb链接依赖而不是-lusb-1.0。 -
我检查了github.com/ryanbinns/ttwatch/blob/master/cmake_modules/… 并检查了
usb-1.0和usb。您是否手动安装了另一个libusb?检查文件/usr/lib/x86_64-linux-gnu/libusb.so是否存在。 -
运行
dpkg-query -S /usr/lib/x86_64-linux-gnu/libusb.so,查看是哪个软件包安装了该文件。 -
我已将代码添加到问题中,并将其从 cmets 中删除。谢谢!
-
出现无规则错误是因为 .so 文件可能在卸载后消失了,而 cmake 还不知道它。执行
cmake .重建cmake缓存和Makefiles。make应该在那之后工作。
标签: c++ c makefile cmake libusb