azure-iot-sdk-c
azure-iot-sdk-c copied to clipboard
Header conflict when cross compiling
Development Machine, OS, Compiler (and Other Relevant Toolchain Info) target system Debian stretch (armv7l) Cross Compiled on WSL Ubuntu 22.04 (x86-64) using GCC 6.3.0 built from source
- native target compiler:
# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/6/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v --with-pkgversion='Debian 6.3.0-18+deb9u1' --with-bugurl=file:///usr/share/doc/gcc-6/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-6 --program-prefix=arm-linux-gnueabihf- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libitm --disable-libquadmath --enable-plugin --enable-default-pie --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-6-armhf/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-6-armhf --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-6-armhf --with-arch-directory=arm --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-sjlj-exceptions --with-arch=armv7-a --with-fpu=vfpv3-d16 --with-float=hard --with-mode=thumb --enable-checking=release --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf
Thread model: posix
gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1)
- cross compiler (same of native, built from source):
$ arm-linux-gnueabihf-gcc -v
Using built-in specs.
COLLECT_GCC=arm-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/opt/cross/libexec/gcc/arm-linux-gnueabihf/6.3.0/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../gcc-6.3.0/configure --prefix=/opt/cross --target=arm-linux-gnueabihf --enable-languages=c,c++ --disable-multilib -v --enable-shared --enable-linker-build-id --enable-threads=posix --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libitm --disable-libquadmath --enable-plugin --enable-default-pie --with-system-zlib --disable-browser-plugin --enable-gtk-cairo --with-arch-directory=arm --enable-multiarch --with-arch=armv7-a --with-fpu=vfpv3-d16 --with-float=hard --with-mode=thumb --with-target-system-zlib --disable-sjlj-exceptions --enable-checking=release --without-included-gettext
Thread model: posix
gcc version 6.3.0 (GCC)
Notice that the cross compiler works fine with other submodules / files / units
SDK Version
Release LTS_03_2024_Ref02 (commit 46996fca3601657a5a721dea66809d2372ae305c)
Protocol
MQTT
Describe the Bug
Hi, thanks for your work. Compiling the project on the target and the host system works fine, but when cross-compiling, I have an header conflict (see console logs and relevant file below). Notice that the cross compiler, that was built from source to match the Glibc version of the target, works fine with other projects not containing the Azure SDK.
MCVE Just compiling the Azure SDK is enough
Console Logs
- Configuration output (cross compiling, some of the output is due to custom messages):
$ cmake -DCMAKE_TOOLCHAIN_FILE=../TC-arm-linux-gnueabihf.cmake ..
-- CMAKE_DL_LIBS=""
-- CMAKE_DL_LIBS=""
-- The C compiler identification is GNU 6.3.0
-- The CXX compiler identification is GNU 6.3.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /opt/cross/bin/arm-linux-gnueabihf-gcc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /opt/cross/bin/arm-linux-gnueabihf-g++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- SICK_SCAN_XD_LIBRARIES="" ; SICK_SCAN_XD_INCLUDE_DIR=""
-- XLIB_ARCH="armv7l"
-- CMAKE_SYSTEM_PROCESSOR="armv7l"
-- Found CURL: /opt/box-root-fs/usr/lib/arm-linux-gnueabihf/libcurl.so (found version "7.81.0")
-- CMAKE_TOOLCHAIN_FILE="/home/abertulli/two_lidars/TC-arm-linux-gnueabihf.cmake"
-- IoT Client SDK Version = 1.12.1
-- Provisioning SDK Version = 1.12.1
CMake Deprecation Warning at azure-iot-sdk-c/deps/azure-macro-utils-c/CMakeLists.txt:4 (cmake_minimum_required):
Compatibility with CMake < 2.8.12 will be removed from a future version of
CMake.
Update the VERSION argument <min> value or use a ...<max> suffix to tell
CMake that the project does not need compatibility with older versions.
CMake Deprecation Warning at azure-iot-sdk-c/deps/umock-c/CMakeLists.txt:4 (cmake_minimum_required):
Compatibility with CMake < 2.8.12 will be removed from a future version of
CMake.
Update the VERSION argument <min> value or use a ...<max> suffix to tell
CMake that the project does not need compatibility with older versions.
-- Looking for include file stdint.h
-- Looking for include file stdint.h - found
-- Looking for include file stdbool.h
-- Looking for include file stdbool.h - found
-- target architecture: ARM
-- Performing Test CXX_FLAG_CXX11
-- Performing Test CXX_FLAG_CXX11 - Success
-- Found OpenSSL: /opt/box-root-fs/usr/lib/arm-linux-gnueabihf/libcrypto.so (found version "1.0.2u")
-- Found CURL: /opt/box-root-fs/usr/lib/arm-linux-gnueabihf/libcurl.so
-- target architecture: ARM
-- IoT Hub Architecture: ARM
-- Configuring done
-- Generating done
-- Build files have been written to: /home/abertulli/two_lidars/build
- compilation output:
$ make
[ 0%] Building CXX object CMakeFiles/single_lidar_listener.dir/single_lidar.cpp.o
In file included from /home/abertulli/two_lidars/single_lidar.cpp:12:0:
/home/abertulli/two_lidars/include/dbg.h:39:76: note: #pragma message: WARNING: the 'dbg.h' header is included in your code base
#pragma message("WARNING: the 'dbg.h' header is included in your code base")
^
[ 1%] Building C object CMakeFiles/single_lidar_listener.dir/sick_scan_xd_api_wrapper.c.o
[ 1%] Linking CXX executable single_lidar_listener
[ 1%] Built target single_lidar_listener
[ 1%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/azure_base32.c.o
[ 1%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/azure_base64.c.o
[ 2%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/buffer.c.o
[ 2%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/constbuffer_array.c.o
[ 2%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/constbuffer_array_batcher.c.o
[ 3%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/connection_string_parser.c.o
[ 3%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/constbuffer.c.o
[ 4%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/consolelogger.c.o
[ 4%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/crt_abstractions.c.o
[ 4%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/constmap.c.o
[ 5%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/doublylinkedlist.c.o
[ 5%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/gballoc.c.o
[ 6%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/gbnetwork.c.o
[ 6%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/gb_stdio.c.o
[ 6%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/gb_time.c.o
[ 7%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/hmac.c.o
[ 7%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/hmacsha256.c.o
[ 8%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/xio.c.o
[ 8%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/singlylinkedlist.c.o
[ 8%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/map.c.o
[ 9%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/sastoken.c.o
[ 9%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/sha1.c.o
[ 10%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/sha224.c.o
[ 10%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/sha384-512.c.o
[ 10%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/strings.c.o
[ 11%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/string_token.c.o
[ 11%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/string_tokenizer.c.o
[ 12%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/uuid.c.o
[ 12%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/urlencode.c.o
[ 12%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/usha.c.o
[ 13%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/vector.c.o
[ 13%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/xlogging.c.o
[ 13%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/optionhandler.c.o
[ 14%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/memory_data.c.o
[ 14%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/adapters/agenttime.c.o
[ 15%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/adapters/condition_pthreads.c.o
[ 15%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/adapters/lock_pthreads.c.o
[ 15%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/adapters/random_posix.c.o
[ 16%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/adapters/platform_linux.c.o
[ 16%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/adapters/socketio_berkeley.c.o
[ 17%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/adapters/tickcounter_linux.c.o
[ 17%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/adapters/threadapi_pthreads.c.o
[ 17%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/adapters/uniqueid_linux.c.o
[ 18%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/adapters/envvariable.c.o
[ 18%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/dns_resolver_sync.c.o
[ 19%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/adapters/linux_time.c.o
[ 19%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/httpapiex.c.o
[ 19%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/httpapiexsas.c.o
[ 20%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/httpheaders.c.o
[ 20%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/adapters/httpapi_curl.c.o
[ 21%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/http_proxy_io.c.o
[ 21%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/adapters/tlsio_openssl.c.o
[ 21%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/adapters/x509_openssl.c.o
[ 22%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/wsio.c.o
[ 22%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/uws_client.c.o
[ 23%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/uws_frame_encoder.c.o
[ 23%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/utf8_checker.c.o
[ 23%] Building C object out/c-utility/CMakeFiles/aziotsharedutil.dir/src/ws_url.c.o
[ 24%] Linking C static library libaziotsharedutil.a
[ 24%] Built target aziotsharedutil
[ 25%] Building C object out/umqtt/CMakeFiles/umqtt.dir/src/mqtt_client.c.o
[ 25%] Building C object out/umqtt/CMakeFiles/umqtt.dir/src/mqtt_codec.c.o
[ 25%] Building C object out/umqtt/CMakeFiles/umqtt.dir/src/mqtt_message.c.o
[ 26%] Linking C static library libumqtt.a
[ 26%] Built target umqtt
[ 27%] Building C object out/iothub_client/CMakeFiles/iothub_client_mqtt_ws_transport.dir/src/iothub_client_authorization.c.o
[ 27%] Building C object out/iothub_client/CMakeFiles/iothub_client_mqtt_ws_transport.dir/src/iothub_client_retry_control.c.o
[ 28%] Building C object out/iothub_client/CMakeFiles/iothub_client_mqtt_ws_transport.dir/src/iothub_transport_ll_private.c.o
[ 28%] Building C object out/iothub_client/CMakeFiles/iothub_client_mqtt_ws_transport.dir/src/iothubtransport_mqtt_common.c.o
[ 28%] Building C object out/iothub_client/CMakeFiles/iothub_client_mqtt_ws_transport.dir/src/iothubtransportmqtt_websockets.c.o
[ 29%] Linking C static library libiothub_client_mqtt_ws_transport.a
[ 29%] Built target iothub_client_mqtt_ws_transport
[ 29%] Building C object out/deps/parson/CMakeFiles/parson.dir/parson.c.o
[ 29%] Linking C static library libparson.a
[ 29%] Built target parson
[ 29%] Building C object out/uamqp/CMakeFiles/uamqp.dir/src/amqp_definitions.c.o
[ 30%] Building C object out/uamqp/CMakeFiles/uamqp.dir/src/amqp_frame_codec.c.o
[ 30%] Building C object out/uamqp/CMakeFiles/uamqp.dir/src/amqp_management.c.o
[ 30%] Building C object out/uamqp/CMakeFiles/uamqp.dir/src/amqpvalue.c.o
[ 31%] Building C object out/uamqp/CMakeFiles/uamqp.dir/src/amqpvalue_to_string.c.o
[ 31%] Building C object out/uamqp/CMakeFiles/uamqp.dir/src/async_operation.c.o
[ 32%] Building C object out/uamqp/CMakeFiles/uamqp.dir/src/cbs.c.o
[ 32%] Building C object out/uamqp/CMakeFiles/uamqp.dir/src/connection.c.o
[ 32%] Building C object out/uamqp/CMakeFiles/uamqp.dir/src/frame_codec.c.o
[ 33%] Building C object out/uamqp/CMakeFiles/uamqp.dir/src/header_detect_io.c.o
In file included from /home/abertulli/two_lidars/azure-iot-sdk-c/uamqp/inc/azure_uamqp_c/server_protocol_io.h:11:0,
from /home/abertulli/two_lidars/azure-iot-sdk-c/uamqp/src/header_detect_io.c:13:
/opt/box-root-fs/usr/include/stdint.h:266:0: error: "SIZE_MAX" redefined [-Werror]
# define SIZE_MAX (4294967295U)
In file included from /home/abertulli/two_lidars/azure-iot-sdk-c/uamqp/src/header_detect_io.c:11:0:
/home/abertulli/two_lidars/azure-iot-sdk-c/c-utility/inc/azure_c_shared_utility/safe_math.h:8:0: note: this is the location of the previous definition
#define SIZE_MAX ((size_t)((size_t)~(size_t)0))
cc1: all warnings being treated as errors
make[2]: *** [out/uamqp/CMakeFiles/uamqp.dir/build.make:202: out/uamqp/CMakeFiles/uamqp.dir/src/header_detect_io.c.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:594: out/uamqp/CMakeFiles/uamqp.dir/all] Error 2
make: *** [Makefile:136: all] Error 2
Relevant files
- CMakeLists.txt: ( the repo is added as a git submodule, pinned to the above mentined commit)
# Set Azure IoT SDK C settings
set(use_mqtt ON CACHE BOOL "Set mqtt on" FORCE )
set(skip_samples ON CACHE BOOL "Set slip_samples on" FORCE )
set(BUILD_TESTING OFF CACHE BOOL "Set BUILD_TESTING off" FORCE )
# Add Azure IoT SDK C
add_subdirectory(./azure-iot-sdk-c out)
compileAsC99()
#Conditionally use the SDK trusted certs in the samples
if(${use_sample_trusted_cert})
add_definitions(-DSET_TRUSTED_CERT_IN_SAMPLES)
include_directories(${PROJECT_SOURCE_DIR}/certs)
set(iothub_c_files ${iothub_c_files} ${PROJECT_SOURCE_DIR}/certs/certs.c)
endif()
include_directories(.)
target_link_libraries(${PROJECT_NAME} iothub_client)
Investigating in the affected files, I see:
-
/opt/box-root-fs/usr/include/stdint.h
(/opt/box-root-fs
is the sysroot of the compiler, in which I copied the system libraries from the target system with rsync)
/* Limit of `size_t' type. */
# if __WORDSIZE == 64
# define SIZE_MAX (18446744073709551615UL)
# else
# ifdef __WORDSIZE32_SIZE_ULONG
# define SIZE_MAX (4294967295UL)
# else
# define SIZE_MAX (4294967295U) // <-------- HERE
# endif
# endif
-
~/two_lidars/azure-iot-sdk-c/c-utility/inc/azure_c_shared_utility/safe_math.h
(~/two_lidars/
being my project):
#ifndef SIZE_MAX
#define SIZE_MAX ((size_t)((size_t)~(size_t)0)) // <---------- HERE
#endif