- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试在项目中使用 LibUSB。但是,每当我尝试使用基本的 libUSB 函数时,我都会收到以下错误:
...src/main/main.cpp.o: In function `main':
...src/main/main.cpp:10: undefined reference to `libusb_init'
...src/main/main.cpp:11: undefined reference to `libusb_set_debug'
collect2: error: ld returned 1 exit status
LibUSB-devel 包已安装(我在 fedora 22 上),我的 IDE KDevelop 找到并识别标题,一旦您添加了 import 语句,它就会提供 LibUSB 代码补全。我的 IDE 或 CMake(我的构建系统)中没有任何自定义包含行,所以我想知道我需要做什么才能让 CMake 找到 LibUSB header 。
这是 main.cpp
的内容,以防万一我搞砸了:
#include <iostream>
#include <libusb-1.0/libusb.h>
int main(int argc, char **argv) {
libusb_init(NULL);
libusb_set_debug(NULL, LIBUSB_LOG_LEVEL_WARNING);
/*snip*/
std::cout << "Hello, world! PTPID=" << std::endl;
return 0;
}
以下是CMakeLists.txt
:
../
cmake_minimum_required(VERSION 2.8.11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_BUILD_TYPE Debug)
project(aProjectThatHasHadIt'sNameObcured)
add_subdirectory(src)
.../src/cmakelists.txt 只是添加子目录
.../源/主/
add_executable(main main.cpp)
最佳答案
通常,要链接第三方库,您需要添加包含目录,编译器将在其中查找 header 以及链接器使用的库。
要添加包含目录,请使用 target_include_directories
,要添加要链接到目标的库,请使用 target_link_libraries
。
对于 libUSB 和 testLibUSB.cpp
源文件,这将导致
add_executable(targetTestLibUSB testLibUSB.cpp)
target_include_directories(targetTestLibUSB ${LIBUSB_INCLUDE_DIR})
target_link_libraries(targetTestLibUSB ${LIBUSB_LIBRARY})
如果您有多个目标,您可能希望在定义任何目标之前使用 include_directories
和 link_libraries
。这些命令在设置后应用于项目的所有目标,并节省大量重复
您可以手动指定 LIBUSB_INCLUDE_DIR
和 LIBUSB_LIBRARY
的路径。但更灵活和可移植的是使用 CMake 内置机制来查找 header 和库。
可以通过find_path
搜索 header ,通过find_library
搜索库。
在你的情况下,这可能是
find_path(LIBUSB_INCLUDE_DIR
NAMES libusb.h
PATH_SUFFIXES "include" "libusb" "libusb-1.0")
find_library(LIBUSB_LIBRARY
NAMES usb
PATH_SUFFIXES "lib" "lib32" "lib64")
PATH_SUFFIXES
是可选的。如果您已将库安装在默认位置,CMake 会自动找到它。否则指定 CMAKE_PREFIX_PATH
,CMake 也会在那里查找 header 和库。您可以通过将变量添加到 CMake GUI 或将 -DCMAKE_PREFIX_PATH=/path/to/add
添加到您的 CMake 调用来指定变量。
一个常见的陷阱是不删除构建目录中的 CMakeCache.txt 文件。 CMake 缓存 LIBUSB_INCLUDE_DIR
和 LIBUSB_LIBRARY
的值,如果您调整前缀路径或搜索逻辑,它仍然不会重新评估变量值,但会保留缓存值.
关于c++ - 如何在 CMake 中链接第三方库 (LibUSB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34995936/
我是一名优秀的程序员,十分优秀!