кросс-компиляция azure iot sdk

Я пытаюсь кросскомпилировать пакет SDK Azure IoT C (https://github.com/azure/azure-iot-sdk-c) для BeagleBoard Black.

Я настроил машину Debian GNU/Linux 8.7 (jessie) и установил набор инструментов, как описано здесь: http://exploringbeaglebone.com/chapter7/.

Затем я выполнил следующие шаги: https://github.com/Azure/azure-iot-sdk-c/blob/master/doc/SDK_cross_compile_example.md и создал файл Toolchain:

INCLUDE(CMakeForceCompiler)

SET(CMAKE_SYSTEM_NAME Linux)     # this one is important
SET(CMAKE_SYSTEM_VERSION 1)     # this one not so much

# this is the location of the amd64 toolchain targeting the Raspberry Pi
SET(CMAKE_C_COMPILER /usr/bin/arm-linux-gnueabihf-gcc)
SET(CMAKE_FIND_ROOT_PATH /usr/lib/arm-linux-gnueabihf)

# search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)

# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

я вызываю Buildscript azure-sdk, используя:

./build.sh --toolchain-file toolchain-bb.cmake -cl --sysroot=/usr/lib/arm-linux-gnueabihf

Возникает следующая ошибка

CMake Error at /usr/share/cmake-3.0/Modules/FindPackageHandleStandardArgs.cmake:136 (message):
Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the
  system variable OPENSSL_ROOT_DIR (missing: OPENSSL_LIBRARIES
  OPENSSL_INCLUDE_DIR)
    Call Stack (most recent call first):
    /usr/share/cmake-3.0/Modules/FindPackageHandleStandardArgs.cmake:343 (_FPHSA_FAILURE_MESSAGE)
    /usr/share/cmake-3.0/Modules/FindOpenSSL.cmake:328 (find_package_handle_standard_args)
  c-utility/CMakeLists.txt:141 (find_package)

я попытался установить openssl, используя:

sudo apt-get install openssl:armhf 

но ошибка остается, если я соберу исходный код для arm64 (используя только файл build.sh из azure-iot-sdk), все будет работать нормально.

если я клонирую openssl и создаю его для целевой руки, я получаю следующую ошибку:

CMake Error at /usr/share/cmake-3.0/Modules/FindPackageHandleStandardArgs.cmake:136 (message):
  Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the
  system variable OPENSSL_ROOT_DIR (missing: OPENSSL_LIBRARIES) (found
  version "1.1.1")

person quadroid    schedule 24.04.2017    source источник
comment
При кросс-компиляции поиск библиотек в каталогах host не выполняется. Именно это и означает SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) (см. документацию). И apt-get работает с пакетами host.   -  person Tsyvarev    schedule 24.04.2017
comment
@Tsyvarev, если я клонирую openssl и соберу его для руки, я получу еще одну ошибку, я отредактировал вопрос   -  person quadroid    schedule 24.04.2017
comment
Вам нужно установить OpenSSL под sysroot и, возможно, дать подсказку о его местонахождении CMake (вероятно, поможет предложенный OPENSSL_ROOT_DIR).   -  person Tsyvarev    schedule 24.04.2017
comment
Если я добавлю каталог в вызов cmake -DOPENSSSL_ROOT_DIR, ошибка останется. Что вы имеете в виду под sysroot   -  person quadroid    schedule 25.04.2017
comment
Под установкой под sysroot я имею в виду, что установленные файлы должны находиться в каталоге, указанном вами как sysroot (/usr/lib/arm-linux-gnueabihf). С данной цепочкой инструментов вы не можете попросить CMake искать библиотеки за пределами этого каталога. Я просто заметил, что когда вы собираете openssl для целевой руки, CMake нашел свои заголовки, но библиотеки все еще отсутствуют. Каково расположение заголовков? (проверьте значение OPENSSL_INCLUDE_DIR в кеше CMake, CMakeCache.txt). Где (в каком каталоге) установлены библиотеки openssl?   -  person Tsyvarev    schedule 25.04.2017


Ответы (1)


Если в вашей цепочке инструментов присутствует Openssl, вам просто нужно добавить пару дополнительных строк в файл цепочки инструментов cmake. Это поможет cmake найти ваши библиотеки и заголовки. Что-то вроде этого:

SET(OPENSSL_ROOT_DIR /path/to/openssl/lib) SET(OPENSSL_INCLUDE_DIR /path/to/openssl/include/)

Если его нет, вам нужно будет перекрестно скомпилировать openssl для вашей цели и установить его в свою цепочку инструментов. Обычно в /<sysroot>/usr/lib и /<sysroot>/usr/include.

В качестве альтернативы, если openssl находится на вашем устройстве, но не в вашей цепочке инструментов, вы можете просто скопировать его с устройства. Пример копирования зависимостей в набор инструментов в демо-версии Raspberry Pi приведен здесь: https://github.com/Azure/azure-iot-sdk-c/blob/master/doc/SDK_cross_compile_example.md

person Mark Radbourne    schedule 12.05.2017