[使用下面的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_DIR
和CURL_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_FIND_ROOT_PATH。有一个SDK交叉编译的工作示例,尽管在Docker容器中执行,但在这里:https://github.com/Azure/azure-iot-sdk-c/blob/master/samples/dockerbuilds/RaspberryPi/Dockerfile。此示例还构建了所有先决条件。