一、编译前环境准备

使用的内核:4.15.0-118-generic(命令:uname -r可以查看)

交叉编译器:aarch64-linux-gnu-gcc

openssl源码:openssl-1.1.1g.tar.gz

本地主机:Ubuntu 18.04.5 LTS

二、OpenSSL静态库编译

解压openssl-1.1.1g.tar.gz,同目录下新建一个文件夹,比如我是rk3399/,然后运行如下命令,(为了网页阅读方便,我这里行末加了换行,其实整段是一条命令):

./config -fPIC no-shared no-asm no-zlib no-sse2 no-comp no-dso --prefix=/home/hesetone/openssl-1.1.1g/rk3399 
--cross-compile-prefix=/usr/local/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
-DOPENSSL_THREADS -pthread -D_REENTRANT -D_THREAD_SAFE -D_THREADSAFE

这里最主要的是加上no-shared选项,shared表示编译动态库,no-shared表示编译静态库,因为需要移植程序到板子上,编译静态库可以省去库移植的麻烦。编译没有错误的话,几分钟就可以在rk3399/目录下发现编译好的include/lib/目录,复制到你的工程即可。

注意,这里--cross-compile-prefix表示你的编译器前缀,因为我的交叉编译器的绝对地址前缀是/usr/local/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-,因为./config在执行的时候,它会在诸如g++、AR、RANLIB等变量前面自动补上名为cross-compile的前缀,我截取我Makefile对应部分展示如下:

##### User defined commands and flags ################################

# We let the C compiler driver to take care of .s files. This is done in
# order to be excused from maintaining a separate set of architecture
# dependent assembler flags. E.g. if you throw -mcpu=ultrasparc at SPARC
# gcc, then the driver will automatically translate it to -xarch=v8plus
# and pass it down to assembler. In any case, we do not define AS or
# ASFLAGS for this reason. CROSS_COMPILE=/usr/local/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
CC=$(CROSS_COMPILE)gcc
CXX=$(CROSS_COMPILE)g++
CPPFLAGS=-DOPENSSL_THREADS -D_REENTRANT -D_THREAD_SAFE -D_THREADSAFE
CFLAGS=-Wall -O3 -fPIC -pthread
CXXFLAGS=-Wall -O3 -fPIC -pthread
LDFLAGS=
EX_LIBS= MAKEDEPEND=$(CROSS_COMPILE)gcc PERL=/usr/bin/perl AR=$(CROSS_COMPILE)ar
ARFLAGS= r
RANLIB=$(CROSS_COMPILE)ranlib
RC= $(CROSS_COMPILE)windres
RCFLAGS= RM= rm -f
RMDIR= rmdir
TAR= tar
TARFLAGS= BASENAME= openssl
NAME= $(BASENAME)-$(VERSION)
# Relative to $(SRCDIR)
TARFILE= ../$(NAME).tar

$(CROSS_COMPILE)变量在挺多地方都有使用,建议还是在./config执行的时候指明,否则这个变量为空白,后面的g++之类的变量,可能就指向系统的g++了,就有可能发生错误或者编出来的东西用不了。

三、工程引用OpenSSL

我的工程目录如下:

hesetone@hesetone-PU451LD:~/CLionProjects/ota_0923_11$ tree
.
├── build
│   ├── CMakeCache.txt
│  .
|   .  上面CMakeCache.txt是cmake ..执行完毕之后,生成的中间件,可以在make之前再次查看以下这个文件,看看相关设置是否配置正确
|  .  下面我的cmake脚本,因为选项比较多,所以写shell了
│   ├── cmake.sh   
│   ├── Makefile
│   └── ota_0923_11
├── cmake-build-debug
|   .
|   .clion生成的中间文件
|    .
├── CMakeLists.txt
├── Download_zip.cpp
├── include
│   ├── openssl_a
│   │   └── openssl
│   │   ├── aes.h
│   │   ├── asn1err.h
        .
        .//openssl 专属头文件
        .
│   │   ├── x509v3.h
│   │   └── x509_vfy.h
│   ├── ota
│   │   ├── Download_zip.h
│   │   ├── error_code.h
│   │   ├── OTA_log.h
│   │   └── Verify.h
│  
|
├── lib
│   ├── curl
│   │   ├── libcurl.a
│   │   ├── libcurl.la
│   │   └── pkgconfig
│   │   └── libcurl.pc
│   ├── libyaml-cpp.a
│   └── openssl_a
│   ├── engines-1.1
│   ├── libcrypto.a
│   ├── libssl.a
│   └── pkgconfig
│   ├── libcrypto.pc
│   ├── libssl.pc
│   └── openssl.pc
├── main.cpp
├── OTA_log.cpp
├── ProgressControl.cpp
└── Verify.cpp 34 directories, 234 files

我在CMakeLists.txt中,对openssl静态库的引用如下,CMAKE_CXX_FLAGS中的-L选项指明openssl库的寻找路径,但是似乎llibssl.alibcrypto.a必须分开指明,不然会报一个no such file or directory的错误,我也疑惑,希望看到的大佬能指明以下,其次,后面的-lssl-lcrypto表示在-L指明的路径下寻找llibssl.alibcrypto.a,且必须先-lssl再写-lcrypto

......
FILE(GLOB SSL_LIBRARY ${PROJECT_SOURCE_DIR}/lib/openssl_a/libssl.a)
FILE(GLOB CRYPTO_LIBRARY ${PROJECT_SOURCE_DIR}/lib/openssl_a/libcrypto.a) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -L/home/hesetone/CLionProjects/ota_0923_11/lib/openssl_a -lssl -lcrypto -pthread") include_directories(
......
${PROJECT_SOURCE_DIR}/include/openssl_a
) add_executable(ota_0923_11 .......)
target_link_libraries(
      .....
${SSL_LIBRARY}
${CRYPTO_LIBRARY}
)



OpenSSL静态库交叉编译的更多相关文章

  1. android ndk-build 编译静态库libxx.a 以及Android studio openssl 静态库配置(cmake)

    android ndk-build 编译静态库libxx.a 需求场景: 目前有安卓编码好的现在的openssl的两个.a,我们需要调用openssl的函数,并把功能再封装成.a; 这样使用时,在an ...

  2. 【转】iOS编译OpenSSL静态库(使用脚本自动编译)

    原文网址:https://www.jianshu.com/p/651513cab181 本篇文章为大家推荐两个脚本,用来iOS系统下编译OpenSSL通用库,如果想了解编译具体过程,请参看<iO ...

  3. VS2010编译链接openssl静态库

    最近工作需要使用一些加密算法.之前尝试过cryptopp以及polarssl,听说openssl中的加密模块特别全,并且特别好用.于是想尝试一下. 一.环境配置 下载openssl,我这里使用的是op ...

  4. android编译openssl静态库.a

    github上有一个开源项目,已经为你编译openssl建好了工程. 地址:https://github.com/aluvalasuman/OpenSSL1.0.1cForAndroid 选择需要的版 ...

  5. 解决引用openssl静态库libcrypto.a和libssl.a出现undefined reference to错误的问题

    最近在做使用openssl链接http和https的项目,编译时出现以下问题. /usr/local/openssl/lib/libcrypto.a(async.o): In function `as ...

  6. iOS 支持arm_64 和 x86_64 的OpenSSL 静态库(libcrypto.a, libssl.a)

    下载链接

  7. NDK jni 加载静态库

    加载静态库到android,静态库的提供方式有2种, a. 通过源文件来编译静态库 b. 加载已经编译好的静态库 首先我们来看,通过源文件来编译静态库,工程目录如下 第一步:我们来看我们的jni目录, ...

  8. NDK 链接第三方静态库的方法

    将NDK编译的第三方静态拷贝到JNI目录下,在Android.mk中添加如下代码 以openssl静态库(libcrypto-static.a)为例 第一种链接方法:LOCAL_LDFLAGS := ...

  9. C/C++ 跨平台交叉编译、静态库/动态库编译、MinGW、Cygwin、CodeBlocks使用原理及链接参数选项

    目录 . 引言 . 交叉编译 . Cygwin简介 . 静态库编译及使用 . 动态库编译及使用 . MinGW简介 . CodeBlocks简介 0. 引言 UNIX是一个注册商标,是要满足一大堆条件 ...

  10. [转]在VS2010 VC++项目中引用Lib静态库(以Openssl为例)

    本文转自:http://kb.cnblogs.com/page/94467/ Openssl是个为网络通信提供安全及数据完整性的一种安全协议,囊括了主要的密码算法.常用的密钥和证书封装管理功能以及SS ...

随机推荐

  1. 利用MOS管构成基本的数字逻辑门

    欢迎各位朋友关注"郝旭帅电子设计团队",本微信公众号会定时更新相关技术类资料.软件等等,希望各位朋友都能在本微信公众号获得一些自己想要的"东西". 非门原理图中 ...

  2. Linux 环境下安装redis

    目录 方法一 编辑安装 1.官网找到下载地址: 2.到目录下载redis安装包 3.下载后解压 4.安装工具 tcl (可以跳过) 5.编译安装 6.修改配置文件 7. 客户端连接 8.配置环境变量 ...

  3. mod操作符效率高吗?

    编程语言中mod取余操作符%的效率不是很高,比如M = N % 10,它花费得时间本机测试是1ms,而如果使用M = N - N / 10 * 10,则只需要0.1ms. 所以平时变成得时候,可以尽量 ...

  4. Linux 开启防火墙端口策略

    1. 安装防火墙 yum install firewalld systemd -y 2. 手动开放防火墙端口 查看防火墙全部设置 firewall-cmd --list-all 若防火墙服务未启动可执 ...

  5. ContextCapture-硬件配置推荐

    ContextCapture倾斜摄影的空三计算.三维建模应用.非常耗费硬件资源,适当调整硬件配置,可以显著提高模型处理时间. 硬件常见问题 随着倾斜摄影建模算法成熟,应用越来越广泛,数据量越来越大,需 ...

  6. salesforce零基础学习(一百三十六)零碎知识点小总结(八)

    本篇参考: Salesforce LWC学习(七) Navigation & Toast https://developer.salesforce.com/docs/platform/lwc/ ...

  7. 2022年官网下安装ZooKeeper最全版与官网查阅方法

    目录 一.环境整合 构建工具(参考工具部署方式) 二.官网下载 三.解压安装 四.配置环境 五.启动运行 六.配置为服务 七.查看设置服务 其他版本安装 构建工具(参考工具部署方式) 一.环境整合 构 ...

  8. 美团一面问我i++跟++i的区别是什么

    美团一面问我i++跟++i的区别是什么 面试官:"i++跟++i的区别是什么?" 我:"i++是先使用然后再执行+1的操作,++i是先执行+1的操作然后再去使用i&quo ...

  9. linux常见的网络操作命令

    1  linux在某个网卡上面添加一条明细路由命令如下 命令的意思是在这台服务器上面添加一条网段为192.168.1.0/24,网关为192.168.2.1,通过eth0这个网卡口出去 ip rout ...

  10. 将大量文件的拓展名中大写字母改为小写:Python实现

      本文介绍基于Python语言,基于一个大文件夹,遍历其中的多个子文件夹,对于每一个子文件夹中的大量文件,批量将其文件的名称或后缀名中的字母由大写修改为小写的方法.   本文期望实现的需求为:现有一 ...