背景:
在 ESP-IDF 中直接使用 Arduino 框架及其第三方库并不是直接可行的,因为它们是两个独立的开发环境。ESP-IDF 是基于 CMake 的构建系统,而 Arduino 框架则是基于其自己的构建系统和 IDE。然而,有一些方法可以让您在 ESP-IDF 项目中利用 Arduino 框架的某些特性或库。
Espressif 提供了一种将 Arduino 框架的组件(Components)集成到 ESP-IDF 项目中的方法。这允许您选择性地使用 Arduino 框架中的库和功能,同时仍然保持 ESP-IDF 的构建系统和底层访问。
实现过程可参考帖子:在 ESP-IDF 中使用 Arduino 框架和Arduino的第三方库
问题描述:
在Linux环境中引用HTTPClient.h并使用其中接口函数时,编译报错如下:
/root/.espressif/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld: esp-idf/arduino/libarduino.a(NetworkClientSecure.cpp.obj):(.literal._ZN19NetworkClientSecure4stopEv+0x0): undefined reference to `_Z15stop_ssl_socketP17sslclient_context'
/root/.espressif/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld: esp-idf/arduino/libarduino.a(NetworkClientSecure.cpp.obj):(.literal._ZN19NetworkClientSecure5writeEPKhj+0xc): undefined reference to `_Z13send_net_dataP17sslclient_contextPKhj'
/root/.espressif/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld: esp-idf/arduino/libarduino.a(NetworkClientSecure.cpp.obj):(.literal._ZN19NetworkClientSecure5writeEPKhj+0x10): undefined reference to `_Z13send_ssl_dataP17sslclient_contextPKhj'
/root/.espressif/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld: esp-idf/arduino/libarduino.a(NetworkClientSecure.cpp.obj):(.literal._ZN19NetworkClientSecure4readEPhj+0x8): undefined reference to `_Z15get_net_receiveP17sslclient_contextPhi'
/root/.espressif/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld: esp-idf/arduino/libarduino.a(NetworkClientSecure.cpp.obj):(.literal._ZN19NetworkClientSecure4readEPhj+0xc): undefined reference to `_Z15get_ssl_receiveP17sslclient_contextPhi'
/root/.espressif/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld: esp-idf/arduino/libarduino.a(NetworkClientSecure.cpp.obj):(.literal._ZN19NetworkClientSecure9availableEv+0xc): undefined reference to `_Z16peek_net_receiveP17sslclient_contexti'
/root/.espressif/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld: esp-idf/arduino/libarduino.a(NetworkClientSecure.cpp.obj):(.literal._ZN19NetworkClientSecure9availableEv+0x10): undefined reference to `_Z12data_to_readP17sslclient_context'
/root/.espressif/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld: esp-idf/arduino/libarduino.a(NetworkClientSecure.cpp.obj):(.literal._ZN19NetworkClientSecure7connectE9IPAddresstPKcS2_S2_S2_+0x8): undefined reference to `_Z16start_ssl_clientP17sslclient_contextRK9IPAddressmPKciS5_bS5_S5_S5_S5_bPS5_'
/root/.espressif/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld: esp-idf/arduino/libarduino.a(NetworkClientSecure.cpp.obj):(.literal._ZN19NetworkClientSecure7connectE9IPAddresstPKcS2_S2_S2_+0xc): undefined reference to `_Z22ssl_starttls_handshakeP17sslclient_context'
/root/.espressif/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld: esp-idf/arduino/libarduino.a(NetworkClientSecure.cpp.obj):(.literal._ZN19NetworkClientSecureC2Ev+0x8): undefined reference to `_Z8ssl_initP17sslclient_context'
/root/.espressif/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld: esp-idf/arduino/libarduino.a(NetworkClientSecure.cpp.obj): in function `_ZN19NetworkClientSecure4stopEv':
/export/esp32/esp-idf-5.3/esp-idf/esp_idf_to_arduino/build/../components/arduino/libraries/NetworkClientSecure/src/NetworkClientSecure.cpp:102:(.text._ZN19NetworkClientSecure4stopEv+0x6): undefined reference to `_Z15stop_ssl_socketP17sslclient_context'
/root/.espressif/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld: esp-idf/arduino/libarduino.a(NetworkClientSecure.cpp.obj): in function `_ZZN19NetworkClientSecureC4EvENKUlP17sslclient_contextE_clES1_':
/export/esp32/esp-idf-5.3/esp-idf/esp_idf_to_arduino/build/../components/arduino/libraries/NetworkClientSecure/src/NetworkClientSecure.cpp:36:(.text._ZZN19NetworkClientSecureC4EvENKUlP17sslclient_contextE_clES1_+0x5): undefined reference to `_Z15stop_ssl_socketP17sslclient_context'
/root/.espressif/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld: esp-idf/arduino/libarduino.a(NetworkClientSecure.cpp.obj): in function `_ZN19NetworkClientSecure5writeEPKhj':
/export/esp32/esp-idf-5.3/esp-idf/esp_idf_to_arduino/build/../components/arduino/libraries/NetworkClientSecure/src/NetworkClientSecure.cpp:231:(.text._ZN19NetworkClientSecure5writeEPKhj+0x16): undefined reference to `_Z13send_net_dataP17sslclient_contextPKhj'
/root/.espressif/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld: /export/esp32/esp-idf-5.3/esp-idf/esp_idf_to_arduino/build/../components/arduino/libraries/NetworkClientSecure/src/NetworkClientSecure.cpp:239:(.text._ZN19NetworkClientSecure5writeEPKhj+0x74): undefined reference to `_Z13send_ssl_dataP17sslclient_contextPKhj'
/root/.espressif/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld: esp-idf/arduino/libarduino.a(NetworkClientSecure.cpp.obj): in function `_ZN19NetworkClientSecure4readEPhj':
/export/esp32/esp-idf-5.3/esp-idf/esp_idf_to_arduino/build/../components/arduino/libraries/NetworkClientSecure/src/NetworkClientSecure.cpp:253:(.text._ZN19NetworkClientSecure4readEPhj+0x10): undefined reference to `_Z15get_net_receiveP17sslclient_contextPhi'
/root/.espressif/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld: /export/esp32/esp-idf-5.3/esp-idf/esp_idf_to_arduino/build/../components/arduino/libraries/NetworkClientSecure/src/NetworkClientSecure.cpp:286:(.text._ZN19NetworkClientSecure4readEPhj+0xda): undefined reference to `_Z15get_ssl_receiveP17sslclient_contextPhi'
/root/.espressif/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld: esp-idf/arduino/libarduino.a(NetworkClientSecure.cpp.obj): in function `_ZN19NetworkClientSecure9availableEv':
/export/esp32/esp-idf-5.3/esp-idf/esp_idf_to_arduino/build/../components/arduino/libraries/NetworkClientSecure/src/NetworkClientSecure.cpp:298:(.text._ZN19NetworkClientSecure9availableEv+0xe): undefined reference to `_Z16peek_net_receiveP17sslclient_contexti'
/root/.espressif/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld: /export/esp32/esp-idf-5.3/esp-idf/esp_idf_to_arduino/build/../components/arduino/libraries/NetworkClientSecure/src/NetworkClientSecure.cpp:302:(.text._ZN19NetworkClientSecure9availableEv+0x2d): undefined reference to `_Z12data_to_readP17sslclient_context'
/root/.espressif/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld: esp-idf/arduino/libarduino.a(NetworkClientSecure.cpp.obj): in function `_ZN19NetworkClientSecure7connectE9IPAddresstPKcS2_S2_S2_':
/export/esp32/esp-idf-5.3/esp-idf/esp_idf_to_arduino/build/../components/arduino/libraries/NetworkClientSecure/src/NetworkClientSecure.cpp:148:(.text._ZN19NetworkClientSecure7connectE9IPAddresstPKcS2_S2_S2_+0x2c): undefined reference to `_Z16start_ssl_clientP17sslclient_contextRK9IPAddressmPKciS5_bS5_S5_S5_S5_bPS5_'
/root/.espressif/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld: /export/esp32/esp-idf-5.3/esp-idf/esp_idf_to_arduino/build/../components/arduino/libraries/NetworkClientSecure/src/NetworkClientSecure.cpp:151:(.text._ZN19NetworkClientSecure7connectE9IPAddresstPKcS2_S2_S2_+0x3f): undefined reference to `_Z22ssl_starttls_handshakeP17sslclient_context'
/root/.espressif/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld: esp-idf/arduino/libarduino.a(NetworkClientSecure.cpp.obj): in function `_ZN19NetworkClientSecure7connectEPKctS1_S1_':
/export/esp32/esp-idf-5.3/esp-idf/esp_idf_to_arduino/build/../components/arduino/libraries/NetworkClientSecure/src/NetworkClientSecure.cpp:196:(.text._ZN19NetworkClientSecure7connectEPKctS1_S1_+0x3f): undefined reference to `_Z16start_ssl_clientP17sslclient_contextRK9IPAddressmPKciS5_bS5_S5_S5_S5_bPS5_'
/root/.espressif/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld: esp-idf/arduino/libarduino.a(NetworkClientSecure.cpp.obj): in function `_ZN19NetworkClientSecureC2Ev':
/export/esp32/esp-idf-5.3/esp-idf/esp_idf_to_arduino/build/../components/arduino/libraries/NetworkClientSecure/src/NetworkClientSecure.cpp:35:(.text._ZN19NetworkClientSecureC2Ev+0x2f): undefined reference to `_Z8ssl_initP17sslclient_context'
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.
ninja failed with exit code 1, output of the command is in the /export/esp32/esp-idf-5.3/esp-idf/esp_idf_to_arduino/build/log/idf_py_stderr_output_108470 and /export/esp32/esp-idf-5.3/esp-idf/esp_idf_to_arduino/build/log/idf_py_stdout_output_108470
同样的代码在windows下arduino idf软件就能编译通过,在Linux下编译就报这个错误。
解决方法:
通过idf.py menuconfig修改sdkconfig文件
idf.py menuconfig->Component config -> mbedTLS -> TLS Key Exchange Methods -> Enable pre-shared-key ciphersuites->Enable PSK based ciphersuite modes
操作截图如下:
idf.py menuconfig
总结:
该方法是纯属自己瞎摸索,仅借鉴使用,非官方标准。
如果需要技术支持,欢迎骚扰(+v:Sw-striving)!