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

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

[使用下面的toolchain.cmake配置构建azure-iot-sdk-c时遇到问题。

SET(CMAKE_SYSTEM_NAME Linux)

SET(CMAKE_SYSTEM_VERSION 1)


SET(CMAKE_SYSTEM_PROCESSOR arm)

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 /home/proper_curl_path/include/)

SET(CURL_LIBRARY /home/proper_curl_path/lib/libcurl.so)

下面是我在控制台上收到的错误:

arm-buildroot-linux-gnueabihf/bin/ld: cannot find -lcurl

基本上在编译过程中,cmake会按预期的方式包含include和lib路径(CURL_INCLUDE_DIR和CURL_LIBRARY)。但是在将azure-binaries与libcurl链接期间,因此CMake正在寻找错误的目录(即sysroot/usr/lib/)(换句话说,编译正在获取通过使用CURL_INCLUDE_DIRCURL_LIBRARY提到的curl路径成功,但是在链接cmake时正在查看libcurl不存在的sysroot/usr/lib/,这就是链接失败的原因)

如何使CMake /链接器查看/home/proper_curl_path/lib目录以解决此链接问题?

edit:以下是cmakelist.txt中代码的一部分,在其中搜索curl库(我相信下面的代码在编译时而不是在链接期间生效。因为编译成功,所以我认为与下面部分无关的任何问题代码))>

if(${use_http})
    if(WIN32)
        set(aziotsharedutil_target_libs ${aziotsharedutil_target_libs} crypt32 winhttp)
    else()
        if (NOT use_builtin_httpapi)
            if (CMAKE_CROSSCOMPILING)
                # As mentioned at https://cmake.org/Wiki/CMake_Cross_Compiling the
                # pkg-config tool can not be used by cmake while cross compiling.
                message(STATUS "Cross compiling not using pkg-config")
            else()
                # try pkg-config first
                find_package(PkgConfig)
                if(PKG_CONFIG_FOUND)
                    pkg_check_modules(CURL libcurl)
                endif()
            endif()

            # if that didn't work, try CMake find_package
            if(NOT CURL_FOUND)
                find_package(CURL)
            endif()

            set(CURL_FIND_REQUIRED 1)
            find_package_handle_standard_args(CURL DEFAULT_MSG CURL_LIBRARIES)

            include_directories(${CURL_INCLUDE_DIRS})
            set(aziotsharedutil_target_libs ${aziotsharedutil_target_libs} ${CURL_LIBRARIES})
        endif(NOT use_builtin_httpapi)
    endif()
endif(${use_http})

编辑2:因为文件真的很大,所以我在这里发布了部分代码,其中target_link_libraries

target_link_libraries(aziotsharedutil ${aziotsharedutil_target_libs})
if(${build_as_dynamic})
    target_link_libraries(aziotsharedutil_dll ${aziotsharedutil_target_libs})
endif()

我在使用下面的toolchain.cmake配置构建azure-iot-sdk-c时遇到了一个问题。 SET(CMAKE_SYSTEM_NAME Linux)SET(CMAKE_SYSTEM_VERSION 1)SET(CMAKE_SYSTEM_PROCESSOR臂)SET(...

cmake linker linker-errors ld azure-iot-sdk
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.