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

Linking error related to libcurl while building azure-iot-sdk-c sample code

我在使用以下 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

在编译 azure-sdk 库期间,cmake 按预期采用 CURL_INCLUDE_DIR 和 CURL_LIBRARY 路径。但是在 azure-sdk repo 中存在的示例代码的构建过程中,它是 failing with -lcurl not found error。这个问题是由于 CMake 正在查找错误的目录(即 sysroot/usr/lib/)而不是搜索 libcurl。所以里面 CURL_LIBRARY 从 toolchain.cmake.

传来

如何让 CMake 查看 CURL_LIBRARY 目录以链接示例代码二进制文件以解决此问题?

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

这个问题是因为在 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}")

如果我们停止构建样本 codes.This 也可以避免这个问题,可以通过制作 skip_samples=ON 来完成。但是即使这个标志在 [=14= 中默认为 ON ] ,它在构建时没有任何效果(可能是因为这行代码在错误的地方)。我们仍然可以通过传递 skip_samples:BOOL=ON 而 运行 cmake 作为避免构建示例代码以下

cmake "-Dskip_samples:BOOL=ON"  path_to_azure_sdk/