Как указать find_package()
на мой "пользовательский" каталог $SYSROOT/usr/lib/arm-linux-gnueabihf/
, чтобы он мог найти libz.so
?
У меня есть библиотека по этому адресу:
/home/user/bla/sysroot/usr/lib/arm-linux-gnueabihf/libz.so
С заголовком, который можно найти здесь:
/home/user/bla/sysroot/usr/include/zlib.h
С CMake я пытаюсь:
cmake_minimum_required(VERSION 3.18)
find_package(ZLIB REQUIRED)
Что приводит к:
CMake Error at /home/user/cmake/linux/share/cmake-3.19/Modules/FindPackageHandleStandardArgs.cmake:218 (message):
Could NOT find ZLIB (missing: ZLIB_LIBRARY) (found version "1.2.11")
Поэтому CMake не может найти ZLIB_LIBRARY
(libz.so
), но может проанализировать версию (1.2.11
) из файла заголовка.
Я установил свой SYSROOT в CMake следующим образом:
SET(CMAKE_FIND_ROOT_PATH "${toolchain_dir}/sysroot/")
Но похоже, что CMake не знает о usr/lib/arm-linux-gnueabihf/libz.so.
Что я пробовал
Я пытался дать ПОДСКАЗКИ или ПУТЬ к find_package
следующим образом:
find_package(ZLIB REQUIRED HINTS "${sysroot_dir}/usr/lib/arm-linux-gnueabihf/" NO_DEFAULT_PATH)
или вот так:
find_package(ZLIB REQUIRED PATH "${sysroot_dir}/usr/lib/arm-linux-gnueabihf/" NO_DEFAULT_PATH)
Но это приводит к следующему сообщению об ошибке:
CMake Error at CMakeLists.txt:12 (find_package):
Could not find a package configuration file provided by "ZLIB" with any of
the following names:
ZLIBConfig.cmake
zlib-config.cmake
Add the installation prefix of "ZLIB" to CMAKE_PREFIX_PATH or set
"ZLIB_DIR" to a directory containing one of the above files. If "ZLIB"
provides a separate development package or SDK, be sure it has been
installed.
дополнительная информация
Вот содержимое моего файла цепочки инструментов, который я использую (нацеленный на raspberry pi 4) с -DCMAKE_TOOLCHAIN_FILE=/path/to/toolchain.cmake
# Define our host system
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)
# toolchain
set(toolchain_dir "/home/user/bla")
set(sysroot_dir "${toolchain_dir}/sysroot")
SET(CMAKE_C_COMPILER "${toolchain_dir}/tools/gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc")
SET(CMAKE_CXX_COMPILER "${toolchain_dir}/tools/gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++")
# Define the sysroot path for the RaspberryPi distribution
SET(CMAKE_FIND_ROOT_PATH "${toolchain_dir}/sysroot/")
message(STATUS "${CMAKE_FIND_ROOT_PATH}")
# Use our definitions for compiler tools
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# Search for libraries and headers in the target directories only
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
Вы распечатали путь и проверили, соответствует ли переменная env
sysroot_dir
тому, что вы ожидаете? Это поможет.@LouisGo
sysroot_dir
— это созданная мной переменная, которая представляет собой абсолютный путь к каталогуsysroot
, в моем примере OP это будет/home/bla/sysroot
, на самом деле путь другой, но идея та же. Связанный вами принтер переменных CMake является полезным фрагментом, хотя я этого не знал. Спасибо!В вашем сообщении я не увидел ни одной строки с параметром
CMAKE_SYSROOT
. Вы можете обновить его для уточнения.@LouisGo Обновленный пост (внизу) с моим файлом цепочки инструментов.
@LouisGo Я заставил это работать. Ваше предложение было в точку. Мой файл набора инструментов не содержал
CMAKE_SYSROOT
. Установка этой переменной заставилаfind_package()
найти мои пакеты. Добавьте это как ответ, и я приму это.