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