编译mbedtls的ssl_client1.c时出现mbedtls_test_cas_pem链接错误
编译mbedtls ssl_client1.c 链接失败问题
问题详情
编译命令:
g++ -I/home/pi/dev/mbedtls/mbedtls/include \ -I/home/pi/dev/mbedtls/mbedtls/tests/include \ -I/home/pi/dev/mbedtls/mbedtls/tests/include/test \ -L/home/pi/dev/mbedtls/mbedtls/library \ ssl_client1.c \ -lmbedtls -lmbedx509 -lmbedcrypto
链接报错:
ssl_client1.c:(.text+0x158): undefined reference to `mbedtls_test_cas_pem_len' /usr/bin/ld: ssl_client1.c:(.text+0x15c): undefined reference to `mbedtls_test_cas_pem_len' /usr/bin/ld: ssl_client1.c:(.text+0x16c): undefined reference to `mbedtls_test_cas_pem' /usr/bin/ld: ssl_client1.c:(.text+0x170): undefined reference to `mbedtls_test_cas_pem'
已知信息:
- 上述未定义符号的声明在
/home/pi/dev/mbedtls/mbedtls/tests/include/test/tests.h中,但无对应测试库可链接 - 已开启
MBEDTLS_PEM_PARSE_C编译选项
解决方法
方法1:替换测试证书为自定义证书
ssl_client1.c是测试示例,依赖测试库内置的证书数据。可以修改代码替换证书引用:
- 准备PEM格式的CA证书文件(如
ca_cert.pem) - 在代码中读取该文件内容,或者直接将证书内容定义为字符串常量,替换原有的
mbedtls_test_cas_pem和mbedtls_test_cas_pem_len引用
方法2:编译测试证书源文件并链接
mbedtls的测试证书定义在测试源码中,可将其编译后参与链接:
- 找到包含
mbedtls_test_cas_pem定义的源文件(通常在/home/pi/dev/mbedtls/mbedtls/tests/src/下,如test_certs.c) - 编译该源文件为目标文件,再和ssl_client1.c一起链接:
# 编译测试证书源文件 gcc -c /home/pi/dev/mbedtls/mbedtls/tests/src/test_certs.c -I/home/pi/dev/mbedtls/mbedtls/include -I/home/pi/dev/mbedtls/mbedtls/tests/include # 完成链接 g++ -I/home/pi/dev/mbedtls/mbedtls/include \ -I/home/pi/dev/mbedtls/mbedtls/tests/include \ -I/home/pi/dev/mbedtls/mbedtls/tests/include/test \ -L/home/pi/dev/mbedtls/mbedtls/library \ ssl_client1.c test_certs.o \ -lmbedtls -lmbedx509 -lmbedcrypto
方法3:使用非测试版客户端示例
若无需测试功能,可改用mbedtls提供的正式客户端示例(如programs/ssl/ssl_client2.c),这类示例不依赖测试库符号,可直接使用系统证书或自定义证书。
内容的提问来源于stack exchange,提问作者codebrane
相关产品推荐
相关产品推荐

