我正在尝试为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)
我知道 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, <[email protected] /cdn-cgi/l/email-protection>
#
# 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)
在/opt/lib中有一个目录pkconfig。在这个目录中有一个 libusb-1.0.pc 文件,我猜它可能与该问题有关。那么我应该如何让 Cmake 找到 /opt/lib/libsub-1.0 呢?
不幸的是,默认的查找脚本不是很强大。如果图书馆不在默认目录之一 http://www.cmake.org/cmake/help/v2.8.12/cmake.html#command:find_library搜索者find_library
,你必须依靠pkg-config http://linux.die.net/man/1/pkg-config告诉您图书馆位于哪里。
万一(不太可能)图书馆未注册pkg-config
要么,你别无选择,只能设置PC_LIBUSB_LIBDIR
and PC_LIBUSB_INCLUDEDIR
在调用 find 脚本之前手动更改变量。这可以从命令行完成(使用-D范围 http://www.cmake.org/cmake/help/v2.8.12/cmake.html#opt:-Dvar:typevalue)或从封闭的 CMake 脚本中(使用set http://www.cmake.org/cmake/help/v2.8.12/cmake.html#command:set).
如果您可以随意更改查找脚本,请考虑添加其他内容HINTS
find 调用使它们更加灵活。例如,使用环境变量作为提示是一种非常流行的机制,也适用于非 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)
从 CMake 3.12 版本开始,CMake 将自动采用<PackageName>_ROOT变量 https://cmake.org/cmake/help/latest/variable/PackageName_ROOT.html#variable:%3CPackageName%3E_ROOT考虑作为调用的提示find_package
调用,以及所有嵌套find_*
从查找脚本中进行的调用,该脚本是由调用触发的find_package
。因此,在这些情况下,您不必再手动指定它们作为提示。请注意,要使其发挥作用,您的cmake_minimum_required https://cmake.org/cmake/help/latest/command/cmake_minimum_required.html版本需要设置为3.12或更高版本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)