如何设置 LIBUSB_INCLUDE_DIR

Ben*_*t62 5 cmake cross-compiling

我正在尝试为arm交叉编译libftdi。当我运行 Cmake 时,我得到:

CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
LIBUSB_INCLUDE_DIR (ADVANCED)
Run Code Online (Sandbox Code Playgroud)

我知道 LIBUSB_INCLUDE_DIR 应该在 libftdi 根目录中的 FindUSB1.cmake 中设置。但是,我不知道如何使 FindUSB1.cmake 找到我已编译并放入 /opt/lib 的 libusb。这是默认文件:

# - Try to find the freetype library
# Once done this defines
#
#  LIBUSB_FOUND - system has libusb
#  LIBUSB_INCLUDE_DIR - the libusb include directory
#  LIBUSB_LIBRARIES - Link these to use libusb

# Copyright (c) 2006, 2008  Laurent Montel, <montel@kde.org>
#
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.


if (LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES)

  # in cache already
  set(LIBUSB_FOUND TRUE)

else (LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES)
  IF (NOT WIN32)
    # use pkg-config to get the directories and then use these values
    # in the FIND_PATH() and FIND_LIBRARY() calls

    find_package(PkgConfig)
    pkg_check_modules(PC_LIBUSB libusb-1.0)
  ENDIF(NOT WIN32)

  FIND_PATH(LIBUSB_INCLUDE_DIR libusb.h
    PATHS ${PC_LIBUSB_INCLUDEDIR} ${PC_LIBUSB_INCLUDE_DIRS})

  FIND_LIBRARY(LIBUSB_LIBRARIES NAMES usb-1.0
    PATHS ${PC_LIBUSB_LIBDIR} ${PC_LIBUSB_LIBRARY_DIRS})

  include(FindPackageHandleStandardArgs)
  FIND_PACKAGE_HANDLE_STANDARD_ARGS(LIBUSB DEFAULT_MSG LIBUSB_LIBRARIES LIBUSB_INCLUDE_DIR)

  MARK_AS_ADVANCED(LIBUSB_INCLUDE_DIR LIBUSB_LIBRARIES)

endif (LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES)
Run Code Online (Sandbox Code Playgroud)

在/opt/lib中有一个目录pkconfig。在这个目录中有一个 libusb-1.0.pc 文件,我猜它可能与该问题有关。那么我应该如何让 Cmake 找到 /opt/lib/libsub-1.0 呢?

Com*_*sMS 6

不幸的是,默认的查找脚本不是很强大。如果该库不在搜索到的默认目录之一find_library中,则必须依靠pkg-config告诉您该库所在的位置。

万一(不太可能)库未注册pkg-config,您别无选择,只能在调用查找脚本之前手动设置PC_LIBUSB_LIBDIR和变量。PC_LIBUSB_INCLUDEDIR这可以从命令行(使用参数-D或从封闭的 CMake 脚本(使用set)来完成。

如果您可以随意更改查找脚本,请考虑HINTS向查找调用添加额外的内容以使其更加灵活。例如,使用环境变量作为提示是一种非常流行的机制,也适用于非 Unix 平台。

FIND_PATH(LIBUSB_INCLUDE_DIR libusb.h
    HINTS $ENV{LIBUSB_ROOT}
    PATHS ${PC_LIBUSB_INCLUDEDIR} ${PC_LIBUSB_INCLUDE_DIRS}
    PATH_SUFFIXES include)

FIND_LIBRARY(LIBUSB_LIBRARIES NAMES usb-1.0
    HINTS $ENV{LIBUSB_ROOT}
    PATHS ${PC_LIBUSB_LIBDIR} ${PC_LIBUSB_LIBRARY_DIRS}
    PATH_SUFFIXES lib)
Run Code Online (Sandbox Code Playgroud)

从 CMake 版本 3.12 开始,CMake 将自动考虑<PackageName>_ROOT变量作为调用的提示find_package,以及find_*从调用find_package. 因此,在这些情况下,您不必再手动指定它们作为提示。请注意,要使其正常工作,您的cmake_minimum_required版本需要设置为 3.12 或更高版本。