构建azure-iot-sdk-c示例代码时与libcurl相关的链接错误

问题描述 投票:0回答:2

[使用下面的toolchain.cmake配置来构建azure-iot-sdk-c示例代码时,我遇到了一个问题。

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

在编译天蓝色的sdk时librarie cmake正在按预期的方式包含include和lib路径(CURL_INCLUDE_DIR和CURL_LIBRARY)。但是在构建sdk存储库中的示例代码期间,它是failing with -lcurl not found error。基本上,当将示例代码二进制文件与libcurl链接时,CMake会查找错误的目录(即sysroot/usr/lib/),而不是在从toolchain.cmake文件传递的CURL_LIBRARY内部搜索libcurl.so。

在示例代码二进制文件的链接过程中,如何使CMake进入CURL_LIBRARY目录以解决此链接问题?

cmake ld azure-iot-hub azure-iot-sdk
2个回答
0
投票

我认为您需要在交叉编译工具链文件中包含CMAKE_FIND_ROOT_PATH。有一个SDK交叉编译的工作示例,尽管在Docker容器中执行,但在这里:https://github.com/Azure/azure-iot-sdk-c/blob/master/samples/dockerbuilds/RaspberryPi/Dockerfile。此示例还构建了所有先决条件。


0
投票

[这个问题是因为在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或在运行cmake时将其传递来完成

cmake "-Dskip_samples:BOOL=ON" /path_to_azure_sdk/
© www.soinside.com 2019 - 2024. All rights reserved.