链接mbedtls库时出现未定义引用错误,如何解决?
编译mbedtls应用时出现未定义引用错误的修复方法
我用mbedtls写了个简单应用,编译时碰到下面的链接错误,该怎么修复?是不是需要链接其他库?
编译错误信息
开始构建... /usr/bin/g++ -fdiagnostics-color=always -g /home/g/projects/aes2/AES_generate.c -o /home/g/projects/aes2/AES_generate -lmbedtls /usr/bin/ld: /tmp/ccvPvJJH.o: in function `main': /home/g/projects/aes2/AES_generate.c:19: undefined reference to `mbedtls_entropy_init' /usr/bin/ld: /home/g/projects/aes2/AES_generate.c:21: undefined reference to `mbedtls_ctr_drbg_init' /usr/bin/ld: /home/g/projects/aes2/AES_generate.c:23: undefined reference to `mbedtls_entropy_func' /usr/bin/ld: /home/g/projects/aes2/AES_generate.c:23: undefined reference to `mbedtls_ctr_drbg_seed' /usr/bin/ld: /home/g/projects/aes2/AES_generate.c:30: undefined reference to `mbedtls_ctr_drbg_random' collect2: error: ld returned 1 exit status
程序代码
#include "mbedtls/entropy.h" #include "mbedtls/ctr_drbg.h" #include <string.h> #include <stdio.h> #if !defined(MBEDTLS_PSA_CRYPTO_C) define MBEDTLS_PSA_CRYPTO_C #endif mbedtls_ctr_drbg_context ctr_drbg; mbedtls_entropy_context entropy; unsigned char key[32]; char const *pers = "aes generate key"; int ret; int main() { mbedtls_entropy_init(&entropy); mbedtls_ctr_drbg_init(&ctr_drbg); if ((ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, (unsigned char *)pers, strlen(pers))) != 0) { printf(" failed\n ! mbedtls_ctr_drbg_init returned -0x%04x\n", -ret); return 0; } if ((ret = mbedtls_ctr_drbg_random(&ctr_drbg, key, 32)) != 0) { printf(" failed\n ! mbedtls_ctr_drbg_random returned -0x%04x\n", -ret); return 0; } // printf() displays the string inside quotation printf("Hello, World!"); return 0; }
问题原因与修复方法
核心问题
你只链接了mbedtls库,但代码中用到的entropy、ctr_drbg相关函数属于mbedtls的底层加密子库,需要显式链接对应的库文件才能找到这些符号。
修正编译命令
修改编译命令,添加-lmbedcrypto和-lmbedx509两个库(按依赖顺序排列更稳妥):
g++ -fdiagnostics-color=always -g /home/g/projects/aes2/AES_generate.c -o /home/g/projects/aes2/AES_generate -lmbedcrypto -lmbedx509 -lmbedtls
mbedtls库说明
mbedtls分为三个核心库,各司其职:
libmbedcrypto:包含加密算法、熵池、随机数生成等底层核心功能,你的代码里用到的函数都属于这个库libmbedx509:处理X.509证书相关逻辑libmbedtls:提供上层TLS协议API
额外代码修正
你的代码里还有一个小语法错误:#if块中的define缺少#,应该改为#define MBEDTLS_PSA_CRYPTO_C,这个错误不会导致链接问题,但建议修正以避免潜在编译警告或逻辑异常。
内容的提问来源于stack exchange,提问作者vico
相关产品推荐
相关产品推荐

