Linux C++ 网络编程学习系列(7)——mbedtls编译使用
mbedtls编译使用
- 环境: Ubuntu18.04
- 编译器:gcc或clang(windows下可用vs编译,或者mingw编译,官网有详细教程,参见:https://tls.mbed.org/kb/compiling-and-building/compiling-mbedtls-in-mingw)
- 编译选项: 静态编译使用
1. mbedtls源码
下载地址: https://github.com/ARMmbed/mbedtls/releases
也可以用git clone, 然后切换到相应版本.
ing@ubuntu:~/opt$ wget https://github.com/ARMmbed/mbedtls/archive/mbedtls-2.16.5.tar.gz
ing@ubuntu:~/opt$ tar -xf mbedtls-mbedtls-2.16.5.tar.gz
ing@ubuntu:~/opt$ cd mbedtls-mbedtls-2.16.5/
ing@ubuntu:~/opt/mbedtls-mbedtls-2.16.5$ mkdir build
ing@ubuntu:~/opt/mbedtls-mbedtls-2.16.5$ cd build/
ing@ubuntu:~/opt/mbedtls-mbedtls-2.16.5/build$ cmake ..
ing@ubuntu:~/opt/mbedtls-mbedtls-2.16.5/build$ make
ing@ubuntu:~/opt/mbedtls-mbedtls-2.16.5/build$ ls include/mbedtls
aes.h ...
ing@ubuntu:~/opt/mbedtls-mbedtls-2.16.5/build$ ls library/ -la
-rw-rw-r-- 1 ing ing 744638 Mar 28 19:32 libmbedcrypto.a
-rw-rw-r-- 1 ing ing 351816 Mar 28 19:32 libmbedtls.a
-rw-rw-r-- 1 ing ing 173904 Mar 28 19:32 libmbedx509.a
注意:
- 这样编译完成之后, 生成include目录下的头文件, 以及library下的.a静态库文件(默认就是静态编译), 也可以生成动态共享库.so
- 使用时就用.h和.a文件就好了
- 编译完成之后也可以
sudo make install, 这样就会把include和library中的.h文件和.a文件分别复制到默认路径/usr/local/include/和/usr/local/lib/目录下. 这样的话我们就不用每次复制.h和.a文件了, 不过我自己不用这个, 我喜欢哪个项目需要就复制过去, 见下例.
2. mbedtls库使用
完整项目示例参见(这个也是cmakelists.txt编写的示例): https://github.com/whuwzp/vim_config/blob/master/test/cmake_example
cmakelists.txt的多文档组织编写说明: https://www.cnblogs.com/whuwzp/p/cmakefiles.html, https://whuwzp.github.io/LinuxCpp-NetWork-0-makefile学习.md
项目目录结构:(省略了build目录)
$ ~/test/cmake_example$ tree
.
├── bin # 生成可执行文件的文件夹
│ └── main
├── CMakeLists.txt # 根目录cmakelists.txt
├── hello1 # 子目录1
│ ├── CMakeLists.txt # 子目录1的cmakelists.txt
│ ├── hello1.cpp
│ └── hello1.h
├── hello2 # 子目录2
│ ├── CMakeLists.txt # 子目录2的cmakelists.txt
│ ├── hello2.cpp
│ └── hello2.h
├── main.cpp # main函数所在源文件, 需要调用hellofunc1和hellofunc2
└── mbedtls # 第三方库
├── include # 第三方库的头文件
│ └── mbedtls
│ ├── aes.h # 省略了mbedtls的其他头文件
│ └── xtea.h
└── lib # 第三方库的库文件
├── libmbedcrypto.a
├── libmbedtls.a
└── libmbedx509.a
其中main.cpp就是复制mbedtls-mbedtls-2.16.5/programs/ssl/ssl_server.c的.
3. -fPIC
有需求如下:
- 使用静态编译后的mbedtls给我的项目test使用
- test最终想要编译为动态链接库,即shared
如果按照上述方法使用.a文件, 编译test时报错如下:
libmbedtls.a(ssl_tls.c.o): relocation R_X86_64_PC32 against symbol mbedtls_x509_crt_profile_suiteb can not be used when making a shared object; recompile with -fPIC
意思是让重新带上-fPIC编译(自己百度-fPIC的用途)
于是:
# add -fPIC
[mbedtls-mbedtls-2.16.5]$ vim CMakeLists.txt
# 在CMAKE_C_FLAGS标识中增加-fPIC
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -W -Wdeclarati on-after-statement -Wwrite-strings -fPIC")
cmake ..
make
# 然后再用.a文件即可
3. 参考网址
- mbedtls下载地址: https://github.com/ARMmbed/mbedtls/releases
- ssl和tls简明教程: http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
- mbedtls官方说明文档: https://tls.mbed.org/high-level-design
Linux C++ 网络编程学习系列(7)——mbedtls编译使用的更多相关文章
- Linux C++ 网络编程学习系列(1)——端口复用实现
Linux C++ 网络编程学习系列(1)--端口复用实现 源码地址:https://github.com/whuwzp/linuxc/tree/master/portreuse 源码说明: serv ...
- Linux C++ 网络编程学习系列(6)——多路IO之epoll高级用法
poll实现多路IO 源码地址:https://github.com/whuwzp/linuxc/tree/master/epoll_libevent 源码说明: server.cpp: 监听127. ...
- Linux C++ 网络编程学习系列(5)——多路IO之epoll边沿触发
多路IO之epoll边沿触发+非阻塞 源码地址:https://github.com/whuwzp/linuxc/tree/master/epoll_ET_LT_NOBLOCK_example 源码说 ...
- Linux C++ 网络编程学习系列(4)——多路IO之epoll基础
epoll实现多路IO 源码地址:https://github.com/whuwzp/linuxc/tree/master/epoll 源码说明: server.cpp: 监听127.1:6666,功 ...
- Linux C++ 网络编程学习系列(3)——多路IO之poll实现
poll实现多路IO 源码地址:https://github.com/whuwzp/linuxc/tree/master/poll 源码说明: server.cpp: 监听127.1:6666,功能是 ...
- Linux C++ 网络编程学习系列(2)——多路IO之select实现
select实现多路IO 源码地址:https://github.com/whuwzp/linuxc/tree/master/select 源码说明: server.cpp: 监听127.1:6666 ...
- Linux C网络编程学习笔记
Linux C网络编程总结报告 一.Linux C 网络编程知识介绍: 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户端:(client) 在网络程序中, ...
- linux下网络编程学习——入门实例ZZ
http://www.cppblog.com/cuijixin/archive/2008/03/14/44480.html 是不是还对用c怎么实现网络编程感到神秘莫测阿,我们这里就要撕开它神秘的面纱, ...
- Linux下网络编程学习杂记
1.TCP/IP协议的体系结构包含四层:应用层(负责应用程序的网络服务,通过端口号识别各个不同的进程)->传输层(传输控制层协议TCP.用户数据报协议UDP.互联网控制消息协议ICMP)-> ...
随机推荐
- 我用STM32MP1做了个疫情监控平台2—Qt环境搭建
目录 1.嵌入式Qt简介 2.查看开发板Qt库的版本 3.主机搭建Qt环境 4.第一个Qt程序--Hello World 5.一些问题 @ 1.嵌入式Qt简介 Qt 是一个跨平台的应用程序开发框架.使 ...
- Python——项目-小游戏2-动画绘制
实现游戏循环还有事件的监听 在上一讲中 你需要完成这样的这样的效果, 如果你还没有完成,请不要继续往下阅读!!切记切记切记.,重要的事情说三遍 我们来看一下什么是游戏循环 所谓的游戏循环很好的理解 就 ...
- 后端程序员不得不会的 Nginx 转发匹配规则
整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 一口气说出 9种 分布式ID生成方式,面试官有点懵了 面试总被问 ...
- 「建议心心」要就来15道多线程面试题一次爽到底(1.1w字用心整理)
. 本文是给**「建议收藏」200MB大厂面试文档,整理总结2020年最强面试题库「CoreJava篇」**写的答案,所有相关文章已经收录在码云仓库:https://gitee.com/bingqil ...
- tomcat启动时间5分钟左右org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [342,445] milliseconds.
org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance ...
- Delphi10.3的DBGrid中memo类型显示内容而不是(WIDEMEMO)
1]连接好数据库,并显示: 2]增加所有字段: 3]添加事件: // FDQuery1UserName: TWideMemoField; procedure TForm1.FDQuery1Use ...
- Python-String字符串操作
name='xioer-pipo' print(name.capitalize()) #第一个字符大写 print(name.expandtabs()) print(name.count('o')) ...
- linux环境下的时间编程
Linux下提供了丰富的api以供开发者们处理和时间相关的问题.然而这些接口看似各自为政实则有有着千丝万缕的联系,在学习和时间中引发了各种各样的混乱.因此时间处理成为了许多Linux开发者的梦魇,遇到 ...
- SqlBulkCopy批量插入数据 显示 来自数据源的 String 类型的给定值不能转换为指定目标列的类型 smalldatetime。错误
因为需要大量插入数据,linq ef无法达到速度的要求,因此把模型转换成SQL ,使用SqlBulkCopy快速插入.但是去提示 来自数据源的 String 类型的给定值不能转换为指定目标列的类型 s ...
- Hook集合----SSDTHook(x86 Win7)
最近在学习Ring0层Hook的一些知识点,很久就写完SSDTHook的代码了,但是一直没有整理成笔记,最近有时间也就整理整理. 介绍: SSDTHook 实质是利用Ntoskrnl.exe 中全局导 ...