【问题标题】:Linking error related to libcurl while building azure-iot-sdk-c sample code构建 azure-iot-sdk-c 示例代码时链接与 libcurl 相关的错误
【发布时间】:2019-11-14 15:04:00
【问题描述】:

我在使用以下 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 如何与 curl 库链接? CMake 是否调用 find_library() 或其他命令来定位 curl 库(可能使用或覆盖您定义的 CURL_LIBRARY 变量)?请显示您的 CMake 代码的其余部分。
  • @squareskittles cmakelist.txt 代码添加
  • 请同时发布您将目标链接到 curl 库的 CMake 代码。 IE。拨打target_link_libraries() 或类似电话。如果你的 find_package() 调用运行,CURL_LIBRARIES 变量应该包含你的 curl 库的路径。
  • @squareskittles 使用 target_link_libraries 编辑
  • @squareskittles 我也在想这个问题与 ld 相关,应该有一些标志或某种方式告诉链接器在应该从 toolchain.cmake 文件设置的特定路径中查找 libcurl .any对此有什么想法?

标签: cmake ld azure-iot-hub azure-iot-sdk


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这个问题是因为在 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 来完成。但是即使这个标志在 azure-iot-sdk-c/CMakeLists.txt 中默认为 ON ,它在构建时也不会产生任何影响(可能是因为这行代码位置错误)。我们仍然可以通过在运行cmake 时传递skip_samples:BOOL=ON 来避免构建示例代码,如下所示

    cmake "-Dskip_samples:BOOL=ON"  path_to_azure_sdk/
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      • 2014-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多