Ошибка связывания, связанная с libcurl при создании примера кода azure-iot-sdk-c

У меня возникла проблема при создании образца кода azure-iot-sdk-c с конфигурацией toolchain.cmake ниже.

SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_C_COMPILER   arm-linux-gcc)
SET(CMAKE_CXX_COMPILER arm-linux-g++)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
SET(CURL_INCLUDE_DIR /curl_path/include/)
SET(CURL_LIBRARY /curl_path/lib/libcurl.so)

Ниже приведена ошибка, которую я получаю на консоли:

/sysroot/bin/ld: cannot find -lcurl

Во время компиляции библиотек azure-sdk cmake принимает пути CURL_INCLUDE_DIR и CURL_LIBRARY, как и ожидалось. но во время создания примера кода, который присутствует в репозитории azure-sdk, это failing with -lcurl not found error. Эта проблема связана с тем, что CMake ищет неправильный каталог (например, sysroot/usr/lib/) вместо поиска в libcurl. так что внутри CURL_LIBRARY передано из toolchain.cmake.

Как я могу заставить CMake заглянуть в каталог CURL_LIBRARY для связывания двоичных файлов примеров кода, чтобы решить эту проблему?


person divakar N    schedule 14.11.2019    source источник
comment
Как ваш CMake связан с библиотекой curl? CMake вызывает find_library() или какую-либо другую команду для поиска библиотеки curl (которая может использовать или перезаписывать переменную CURL_LIBRARY, которую вы определили)? Пожалуйста, покажите остальную часть вашего кода CMake.   -  person squareskittles    schedule 14.11.2019
comment
Добавлен код @squareskittles cmakelist.txt   -  person divakar N    schedule 15.11.2019
comment
Также опубликуйте код CMake, в котором вы связываете свои цели с библиотекой curl. Т.е. вызов target_link_libraries() или аналогичный. Если ваш find_package() вызов запущен, переменная CURL_LIBRARIES должна содержать путь к вашей библиотеке curl.   -  person squareskittles    schedule 15.11.2019
comment
@squareskittles отредактированы с помощью target_link_libraries   -  person divakar N    schedule 15.11.2019
comment
@squareskittles также я думал, поскольку эта проблема связана с ld, должны быть некоторые флаги или какой-то способ указать компоновщику искать libcurl в конкретном пути, который должен быть установлен из файла toolchain.cmake. любая идея по этому поводу?   -  person divakar N    schedule 15.11.2019
comment
Я не думаю, что это обычная практика - указывать информацию о конкретной библиотеке в файле инструментальной цепочки. Лучше всего установить все это в вашем CMake верхнего уровня или, что еще лучше, установить его в разделе библиотек curl опубликованного вами кода CMake. Вы не предоставили достаточно информации, чтобы понять, что происходит. Вы можете прочитать и предоставить информацию, чтобы составить минимальный воспроизводимый пример. Такая информация будет включать полный вывод CMake, полный make журнал ошибок, версию CMake и т. Д.   -  person squareskittles    schedule 15.11.2019
comment
@squareskittles знаете ли вы, как я могу заставить cmake перестать связываться с lcurl по умолчанию?   -  person divakar N    schedule 15.11.2019


Ответы (2)


Я думаю, вам нужно включить CMAKE_FIND_ROOT_PATH в файл цепочки инструментов кросс-компиляции. Вот рабочий пример кросс-компиляции SDK, хотя и выполненный в контейнере Docker: https://github.com/Azure/azure-iot-sdk-c/blob/master/samples/dockerbuilds/RaspberryPi/Dockerfile. В этом примере также создаются все предварительные условия.

person Mark Radbourne    schedule 15.11.2019

Эта проблема возникла из-за того, что в примере кода azure-iot-sdk они напрямую ссылаются на библиотеку curl, прежде чем найти пакет curl. Что-то вроде find_package(CURL), которое они должны делать перед target_link_libraries(azure_sample_bin lcurl). я смог исправить это, добавив ниже код внутри azure-iot-sdk-c/CMakeLists.txt

add_library( curl SHARED IMPORTED)
set_property(TARGET curl PROPERTY IMPORTED_LOCATION "${CURL_LIBRARY}")

Также этой проблемы можно избежать, если мы перестанем создавать образцы кодов. Это можно сделать, сделав skip_samples=ON. Но даже если этот флаг по умолчанию ON внутри azure-iot-sdk-c/CMakeLists.txt, он не оказывает никакого влияния на сборку (может быть, потому что эта строка кода в неправильном месте). Мы все еще можем создать образец кода aviod, передав skip_samples:BOOL=ON при запуске cmake, как показано ниже

cmake "-Dskip_samples:BOOL=ON"  path_to_azure_sdk/
person divakar N    schedule 18.11.2019