Compile error when using mqtt_client in ESP32

Hi all,
I’m getting error when compile source code with mqtt_client API. I’m writing a MQTT init function as below. But when Compiling, it got failed with log undefined reference to `mbedtls_ssl_xxxx’

C:/Users/Loc_Le/.platformio/packages/toolchain-xtensa-esp-elf@13.2.0+20240530/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld.exe: C:/Users/Loc_Le/.platformio/packages/framework-arduinoespressif32/tools/esp32-arduino-libs/esp32s3/lib\libesp-tls.a(esp_tls_mbedtls.c.obj):(.literal.esp_mbedtls_read+0x0): undefined reference to `mbedtls_ssl_read'
C:/Users/Loc_Le/.platformio/packages/toolchain-xtensa-esp-elf@13.2.0+20240530/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld.exe: C:/Users/Loc_Le/.platformio/packages/framework-arduinoespressif32/tools/esp32-arduino-libs/esp32s3/lib\libesp-tls.a(esp_tls_mbedtls.c.obj):(.literal.esp_mbedtls_write+0x0): undefined reference to `mbedtls_ssl_write'
C:/Users/Loc_Le/.platformio/packages/toolchain-xtensa-esp-elf@13.2.0+20240530/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld.exe: C:/Users/Loc_Le/.platformio/packages/framework-arduinoespressif32/tools/esp32-arduino-libs/esp32s3/lib\libesp-tls.a(esp_tls_mbedtls.c.obj):(.literal.set_ca_cert+0x0): undefined reference to `mbedtls_ssl_conf_authmode'
C:/Users/Loc_Le/.platformio/packages/toolchain-xtensa-esp-elf@13.2.0+20240530/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld.exe: C:/Users/Loc_Le/.platformio/packages/framework-arduinoespressif32/tools/esp32-arduino-libs/esp32s3/lib\libesp-tls.a(esp_tls_mbedtls.c.obj):(.literal.set_ca_cert+0x4): undefined reference to `mbedtls_ssl_conf_ca_chain'
C:/Users/Loc_Le/.platformio/packages/toolchain-xtensa-esp-elf@13.2.0+20240530/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld.exe: C:/Users/Loc_Le/.platformio/packages/framework-arduinoespressif32/tools/esp32-arduino-libs/esp32s3/lib\libesp-tls.a(esp_tls_mbedtls.c.obj):(.literal.set_pki_context+0xc): undefined reference to `mbedtls_ssl_conf_own_cert'
C:/Users/Loc_Le/.platformio/packages/toolchain-xtensa-esp-elf@13.2.0+20240530/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld.exe: C:/Users/Loc_Le/.platformio/packages/framework-arduinoespressif32/tools/esp32-arduino-libs/esp32s3/lib\libesp-tls.a(esp_tls_mbedtls.c.obj):(.literal.esp_mbedtls_verify_certificate+0x0): undefined reference to `mbedtls_ssl_get_verify_result'
C:/Users/Loc_Le/.platformio/packages/toolchain-xtensa-esp-elf@13.2.0+20240530/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld.exe: C:/Users/Loc_Le/.platformio/packages/framework-arduinoespressif32/tools/esp32-arduino-libs/esp32s3/lib\libesp-tls.a(esp_tls_mbedtls.c.obj):(.literal.esp_mbedtls_handshake+0x0): undefined reference to `mbedtls_ssl_handshake'
C:/Users/Loc_Le/.platformio/packages/toolchain-xtensa-esp-elf@13.2.0+20240530/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld.exe: C:/Users/Loc_Le/.platformio/packages/framework-arduinoespressif32/tools/esp32-arduino-libs/esp32s3/lib\libesp-tls.a(esp_tls_mbedtls.c.obj):(.literal.esp_mbedtls_get_bytes_avail+0x0): undefined reference to `mbedtls_ssl_get_bytes_avail'
C:/Users/Loc_Le/.platformio/packages/toolchain-xtensa-esp-elf@13.2.0+20240530/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld.exe: C:/Users/Loc_Le/.platformio/packages/framework-arduinoespressif32/tools/esp32-arduino-libs/esp32s3/lib\libesp-tls.a(esp_tls_mbedtls.c.obj):(.literal.esp_mbedtls_cleanup+0x4): undefined reference to `mbedtls_ssl_config_free'
C:/Users/Loc_Le/.platformio/packages/toolchain-xtensa-esp-elf@13.2.0+20240530/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld.exe: C:/Users/Loc_Le/.platformio/packages/framework-arduinoespressif32/tools/esp32-arduino-libs/esp32s3/lib\libesp-tls.a(esp_tls_mbedtls.c.obj):(.literal.esp_mbedtls_cleanup+0x8): undefined reference to `mbedtls_ssl_free'
C:/Users/Loc_Le/.platformio/packages/toolchain-xtensa-esp-elf@13.2.0+20240530/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld.exe: C:/Users/Loc_Le/.platformio/packages/framework-arduinoespressif32/tools/esp32-arduino-libs/esp32s3/lib\libesp-tls.a(esp_tls_mbedtls.c.obj):(.literal.set_client_config+0x0): undefined reference to `mbedtls_ssl_set_hostname'
C:/Users/Loc_Le/.platformio/packages/toolchain-xtensa-esp-elf@13.2.0+20240530/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld.exe: C:/Users/Loc_Le/.platformio/packages/framework-arduinoespressif32/tools/esp32-arduino-libs/esp32s3/lib\libesp-tls.a(esp_tls_mbedtls.c.obj):(.literal.set_client_config+0x4): undefined reference to `mbedtls_ssl_config_defaults'
C:/Users/Loc_Le/.platformio/packages/toolchain-xtensa-esp-elf@13.2.0+20240530/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld.exe: C:/Users/Loc_Le/.platformio/packages/framework-arduinoespressif32/tools/esp32-arduino-libs/esp32s3/lib\libesp-tls.a(esp_tls_mbedtls.c.obj):(.literal.set_client_config+0x8): undefined reference to `mbedtls_ssl_conf_ciphersuites'
C:/Users/Loc_Le/.platformio/packages/toolchain-xtensa-esp-elf@13.2.0+20240530/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld.exe: C:/Users/Loc_Le/.platformio/packages/framework-arduinoespressif32/tools/esp32-arduino-libs/esp32s3/lib\libesp-tls.a(esp_tls_mbedtls.c.obj):(.literal.esp_create_mbedtls_handle+0xc): undefined reference to `mbedtls_ssl_init'
C:/Users/Loc_Le/.platformio/packages/toolchain-xtensa-esp-elf@13.2.0+20240530/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld.exe: C:/Users/Loc_Le/.platformio/packages/framework-arduinoespressif32/tools/esp32-arduino-libs/esp32s3/lib\libesp-tls.a(esp_tls_mbedtls.c.obj):(.literal.esp_create_mbedtls_handle+0x10): undefined reference to `mbedtls_ssl_config_init'
C:/Users/Loc_Le/.platformio/packages/toolchain-xtensa-esp-elf@13.2.0+20240530/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld.exe: C:/Users/Loc_Le/.platformio/packages/framework-arduinoespressif32/tools/esp32-arduino-libs/esp32s3/lib\libesp-tls.a(esp_tls_mbedtls.c.obj):(.literal.esp_create_mbedtls_handle+0x14): undefined reference to `mbedtls_ssl_conf_rng'
C:/Users/Loc_Le/.platformio/packages/toolchain-xtensa-esp-elf@13.2.0+20240530/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld.exe: C:/Users/Loc_Le/.platformio/packages/framework-arduinoespressif32/tools/esp32-arduino-libs/esp32s3/lib\libesp-tls.a(esp_tls_mbedtls.c.obj):(.literal.esp_create_mbedtls_handle+0x18): undefined reference to `mbedtls_ssl_setup'
C:/Users/Loc_Le/.platformio/packages/toolchain-xtensa-esp-elf@13.2.0+20240530/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld.exe: C:/Users/Loc_Le/.platformio/packages/framework-arduinoespressif32/tools/esp32-arduino-libs/esp32s3/lib\libesp-tls.a(esp_tls_mbedtls.c.obj):(.literal.esp_create_mbedtls_handle+0x1c): undefined reference to `mbedtls_ssl_set_bio'
....
void initMQTT() {
    esp_mqtt_client_config_t mqtt_cfg = {
        .broker = {
            .address = {
                .uri = "localhost",
            },
        },
        .credentials = {
            .username = "",
            .authentication = {
                .password = "",
            },
        },
        .session = {
            .keepalive = 60,
        }
    };
  
    mqtt_client = esp_mqtt_client_init(&mqtt_cfg);
    if (mqtt_client == NULL) {
        Serial.println("MQTT client init failed");
        return;
    }
  
    esp_err_t err = esp_mqtt_client_start(mqtt_client);
    if (err != ESP_OK) {
        Serial.printf("MQTT client start failed: %s\n", esp_err_to_name(err));
    } else {
        Serial.println("MQTT client started successfully");
    }
}

Here is my platformio.ini

[env:seeed_xiao_esp32s3]
platform = espressif32
board = seeed_xiao_esp32s3
framework = arduino
build_flags = -DBOARD_HAS_PSRAM
			-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_WARN
board_build.arduino.memory_type = qio_opi
board_build.f_flash = 80000000L
board_build.flash_mode = qio
monitor_speed = 115200
monitor_rts = 0
monitor_dtr = 0
board_build.filesystem = littlefs
lib_deps = 
	seeed-studio/Seeed_Arduino_SSCMA@^1.0.0
	bblanchon/ArduinoJson@^7.4.1
	hideakitai/ArduinoEigen@^0.3.2

Does the same occur when you use

platform = espressif32@6.10.0

?

The base Arduino libraries really really shouldn’t be missing mbedtls…

Thank you, it worked. But I don’t understand why? My platformio configuration to use the latest version of espressif.

Well… platform = espressif32 will behave like:

That means if at any point in time you installed a “newer” platform version like https://github.com/pioarduino/platform-espressif32 (which has Arduino-ESP32 3.x support), it will be taken instead, and some things may be broken there, or, you have an older version of that platform.

Try to always be explicit in the platform versioning to avoid these surprises.

I can also recommend to just delete all C:\Users\<user>\.platformio\platforms\espressif32* folders to get a clean state again.

Yes, now I understand. Thank you for your sharing and valuable advice