CMake/Make 找不到 libusb
CMake/Make cannot find libusb
我是 C/C++ 的新手,正在尝试在 Ubuntu 机器上从 github 本地构建和 运行 ttwatch(Trusty塔尔)。说明包括首先安装一些库: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
但是 运行ning 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.
我不知道 Debian 有软件包 libusb-dev
和
libusb-1.0-dev
。从包装信息我不知道为什么有 2
同一个库的包,也许 libusb-dev
是一个旧版本
不同的 API 和其他包可能仍将其作为依赖项。所以
删除包可能不是一个好主意,除非你不这样做 care/need
依赖 libusb-dev
的包,在这种情况下你可以做 apt-get purge
libusb-dev && apt-get autoremove
。请注意,此 可能会 卸载
你需要的包裹。所以只有当你知道自己在做什么时才去做。
没想到Debian允许你同时安装这两个包
时间,但这可能是因为两个库的 APIs 不同并且不相同
互相冲突。
这似乎混淆了 cmake
,当两个库都无法处理时
同时安装。我浏览了 issues 页面并且我
还没有找到与此相关的问题。因此,如果您无法设法构建它,
如果您没有 github,我建议您转到 issue 页面
帐户,创建一个并留下有关构建包的错误报告
libusb-dev
和 libusb-1.0-dev
同时安装。
另一种选择是在执行 cmake_modules/FindLibUSB.cmake
之前对文件进行小的修改
$ mkdir build && cd build
$ cmake ..
在 current stable version it is line 62 上找到行 find_library(LIBUSB_1_LIBRARY
。下一行是 NAMES
下一行是 usb-1.0 usb
。从中删除 usb
,这样
find_library
只搜索 libusb-1.0
。保存文件然后你就可以做
$ mkdir build && cd build
$ cmake ..
这应该可以解决问题。
我是 C/C++ 的新手,正在尝试在 Ubuntu 机器上从 github 本地构建和 运行 ttwatch(Trusty塔尔)。说明包括首先安装一些库: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
但是 运行ning 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.
我不知道 Debian 有软件包 libusb-dev
和
libusb-1.0-dev
。从包装信息我不知道为什么有 2
同一个库的包,也许 libusb-dev
是一个旧版本
不同的 API 和其他包可能仍将其作为依赖项。所以
删除包可能不是一个好主意,除非你不这样做 care/need
依赖 libusb-dev
的包,在这种情况下你可以做 apt-get purge
libusb-dev && apt-get autoremove
。请注意,此 可能会 卸载
你需要的包裹。所以只有当你知道自己在做什么时才去做。
没想到Debian允许你同时安装这两个包 时间,但这可能是因为两个库的 APIs 不同并且不相同 互相冲突。
这似乎混淆了 cmake
,当两个库都无法处理时
同时安装。我浏览了 issues 页面并且我
还没有找到与此相关的问题。因此,如果您无法设法构建它,
如果您没有 github,我建议您转到 issue 页面
帐户,创建一个并留下有关构建包的错误报告
libusb-dev
和 libusb-1.0-dev
同时安装。
另一种选择是在执行 cmake_modules/FindLibUSB.cmake
之前对文件进行小的修改
$ mkdir build && cd build
$ cmake ..
在 current stable version it is line 62 上找到行 find_library(LIBUSB_1_LIBRARY
。下一行是 NAMES
下一行是 usb-1.0 usb
。从中删除 usb
,这样
find_library
只搜索 libusb-1.0
。保存文件然后你就可以做
$ mkdir build && cd build
$ cmake ..
这应该可以解决问题。