在使用下面的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路径。但是在构建示例代码的过程中,它是failing with -lcurl not found error。该问题是由于CMake正在查找错误的目录(即sysroot/usr/lib/),而不是搜索libcurl。所以在内部,CURL_LIBRARY是从toolchain.cmake传入的。
如何让CMake在CURL_LIBRARY目录中查找示例代码二进制文件的链接以解决此问题?
发布于 2019-11-18 23:52:35
这个问题是因为在azure-iot-sdk示例代码中,他们在找到curl包之前直接引用了curl库,.which类似于他们应该在target_link_libraries(azure_sample_bin lcurl)之前做的find_package(CURL)。我能够在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 .But来完成此问题,即使此标志在azure-iot-sdk-c/CMakeLists.txt中默认为ON,它在构建时不会产生任何影响(可能是因为此行代码位于错误的位置).we仍然可以通过在运行cmake时传递skip_samples:BOOL=ON来避免构建示例代码,如下所示
cmake "-Dskip_samples:BOOL=ON" path_to_azure_sdk/发布于 2019-11-16 07:30:33
我认为你需要在你的交叉编译工具链文件中包含CMAKE_FIND_ROOT_PATH。这里有一个SDK的交叉编译的工作示例,尽管是在Docker容器中执行的:https://github.com/Azure/azure-iot-sdk-c/blob/master/samples/dockerbuilds/RaspberryPi/Dockerfile。此示例还构建了所有前提条件。
https://stackoverflow.com/questions/58859841
复制相似问题