Linux C++ 网络编程学习系列(7)——mbedtls编译使用

mbedtls编译使用

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

注意:

  1. 这样编译完成之后, 生成include目录下的头文件, 以及library下的.a静态库文件(默认就是静态编译), 也可以生成动态共享库.so
  2. 使用时就用.h和.a文件就好了
  3. 编译完成之后也可以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

有需求如下:

  1. 使用静态编译后的mbedtls给我的项目test使用
  2. 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. 参考网址

  1. mbedtls下载地址: https://github.com/ARMmbed/mbedtls/releases
  2. ssl和tls简明教程: http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
  3. mbedtls官方说明文档: https://tls.mbed.org/high-level-design
原文地址:https://www.cnblogs.com/whuwzp/p/mbedtls_make.html