使用Zephyr开发Nordic NRF5240应用时遭遇mbedtls函数未定义引用错误
看起来你遇到的是Zephyr环境下使用mbedtls HKDF功能时的链接错误,找不到mbedtls_md_info_from_type和mbedtls_hkdf这两个核心函数。先结合你的代码、配置和错误信息分析问题,再给出针对性的解决思路:
你的问题场景
会话密钥生成代码
int derive_session_key(const uint8_t *device_token_key, const uint8_t *nonce1, const uint8_t *nonce2, uint16_t out_key_len, uint8_t *output_key) { const uint8_t *ikm = device_token_key; const size_t ikm_len = TOKEN_KEY_SIZE; uint8_t salt[NONCE_SIZE]; add_arrays(nonce1, nonce2, salt, NONCE_SIZE); const size_t salt_len = NONCE_SIZE; const uint8_t *info = (const uint8_t *)INFO_STR; const size_t info_len = strlen(INFO_STR); int ret = mbedtls_hkdf( mbedtls_md_info_from_type(MBEDTLS_MD_SHA256), salt, salt_len, ikm, ikm_len, info, info_len, output_key, out_key_len ); if (ret != 0 ) { LOG_ERR("Error! Creating session key. Ret : %d", ret); return RET_ERROR; } return RET_OK; }
项目配置prj.conf
# Enable Nordic Crypto backend CONFIG_NRF_SECURITY=y CONFIG_MBEDTLS=y CONFIG_MBEDTLS_SHA256_C=y CONFIG_MBEDTLS_PSA_CRYPTO_C=y CONFIG_MBEDTLS_HKDF_C=y CONFIG_MBEDTLS_BUILTIN=y CONFIG_MBEDTLS_CIPHER_MODE_CBC=y CONFIG_MBEDTLS_AES_C=y CONFIG_MBEDTLS_HEAP_SIZE=8192 CONFIG_HEAP_MEM_POOL_SIZE=4096 CONFIG_MBEDTLS_ENABLE_HEAP=y CONFIG_PSA_WANT_KEY_TYPE_AES=y CONFIG_PSA_WANT_AES_KEY_SIZE_128=y CONFIG_PSA_WANT_ALG_CMAC=y CONFIG_PSA_WANT_ALG_ECB_NO_PADDING=y CONFIG_PSA_WANT_ALG_CBC_NO_PADDING=y
链接错误信息
/home/src/app_auth.c:356: undefined reference to
mbedtls_md_info_from_type' /home/user/zephyr-sdk-0.17.0/arm-zephyr-eabi/bin/../lib/gcc/arm-zephyr-eabi/12.2.0/../../../../arm-zephyr-eabi/bin/ld.bfd: /home/src/app_auth.c:356: undefined reference tombedtls_hkdf'
collect2: error: ld returned 1 exit status
问题根源及解决方法
这类链接错误的核心原因是:你启用了CONFIG_NRF_SECURITY=y(Nordic安全后端),它会替换部分mbedtls原生实现,同时你的配置缺少了对mbedtls消息摘要模块的显式启用,或者配置组合存在兼容性冲突。
具体解决步骤
添加mbedtls MD模块配置
mbedtls_md_info_from_type属于mbedtls的消息摘要(MD)基础模块,需要在prj.conf中显式启用:CONFIG_MBEDTLS_MD_C=y这个配置会编译mbedtls的MD相关核心函数,补上你缺失的
mbedtls_md_info_from_type。启用Nordic后端的HKDF支持
当使用CONFIG_NRF_SECURITY=y时,建议显式启用Nordic安全后端的HKDF SHA256实现,确保和mbedtls的调用兼容:CONFIG_NRF_SECURITY_HKDF_SHA256=y调整mbedtls构建模式
你的配置中使用了CONFIG_MBEDTLS_BUILTIN=y(使用Zephyr自带的mbedtls),但结合Nordic安全后端可能存在冲突。如果前两步无效,可以尝试注释掉这一行,让Nordic Security来管理mbedtls的实现:# CONFIG_MBEDTLS_BUILTIN=y验证头文件包含
确保代码文件中包含了必要的mbedtls头文件,避免因声明缺失导致的隐式声明问题:#include "mbedtls/hkdf.h" #include "mbedtls/md.h"
调整后的prj.conf关键配置示例
# Enable Nordic Crypto backend CONFIG_NRF_SECURITY=y CONFIG_MBEDTLS=y CONFIG_MBEDTLS_SHA256_C=y CONFIG_MBEDTLS_PSA_CRYPTO_C=y CONFIG_MBEDTLS_HKDF_C=y # 启用mbedtls消息摘要核心模块 CONFIG_MBEDTLS_MD_C=y # 启用Nordic后端的HKDF SHA256实现 CONFIG_NRF_SECURITY_HKDF_SHA256=y # 注释掉可能冲突的内置mbedtls配置(按需调整) # CONFIG_MBEDTLS_BUILTIN=y CONFIG_MBEDTLS_CIPHER_MODE_CBC=y CONFIG_MBEDTLS_AES_C=y CONFIG_MBEDTLS_HEAP_SIZE=8192 CONFIG_HEAP_MEM_POOL_SIZE=4096 CONFIG_MBEDTLS_ENABLE_HEAP=y CONFIG_PSA_WANT_KEY_TYPE_AES=y CONFIG_PSA_WANT_AES_KEY_SIZE_128=y CONFIG_PSA_WANT_ALG_CMAC=y CONFIG_PSA_WANT_ALG_ECB_NO_PADDING=y CONFIG_PSA_WANT_ALG_CBC_NO_PADDING=y
额外提示
如果调整配置后仍有问题,建议清理构建缓存后重新编译,避免旧缓存导致配置不生效:
west build -t clean west build
内容来源于stack exchange

