一、编译前环境准备

使用的内核: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. Python使用HTMLTestRunner运行所有用例并产生报告

    #coding:utf-8import unittestimport osimport sysimport HTMLTestRunnercase_path = os.path.join(os.path ...

  2. Mybatis学习四(分页助手pagehelper)

    Mybatis学习过程中有一个很重要的插件分页助手(pagehelper) 能够运用这个插件也非常简单 1.导入jar包 [jsqlparser-2.0.jar包] [点击下载https://gith ...

  3. docker之企业级镜像仓库Harbor

    Harbor概述 Habor是由VMWare公司开源的容器镜像仓库.事实上,Habor是在Docker Registry上进行了相应的 企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管 ...

  4. 【PB案例学习笔记】-02 目录浏览器

    写在前面 这是PB案例学习笔记系列文章的第二篇,该系列文章适合具有一定PB基础的读者, 通过一个个由浅入深的编程实战案例学习,提高编程技巧,以保证小伙伴们能应付公司的各种开发需求. 文章中设计到的源码 ...

  5. 终于搞懂了!原来 Vue 3 的 generate 是这样生成 render 函数的

    前言 在之前的 面试官:来说说vue3是怎么处理内置的v-for.v-model等指令? 文章中讲了transform阶段处理完v-for.v-model等指令后,会生成一棵javascript AS ...

  6. PhiData 一款开发AI搜索、agents智能体和工作流应用的AI框架

    引言 在人工智能领域,构建一个能够理解并响应用户需求的智能助手是一项挑战性的任务.PhiData作为一个开源框架,为开发者提供了构建具有长期记忆.丰富知识和强大工具的AI助手的可能性.本文将介绍Phi ...

  7. win10找回Ubuntu启动项(非EasyBCD)

    最近想对装在电脑上的Ubuntu进行更新,但是之前在BIOS里改了引导系统的文件,导致找不到Ubuntu启动项,EasyBCD程序也不起作用(整块硬盘Windows分区都是GPT,改BIOS也没什么用 ...

  8. Http 代理工具 实战 支持网页与QQ代理

    前言: 有些公司不让员工上Q或封掉某些网站,这时候,干着急没办法,只能鄱墙.如果上网搜代理IP,很少能用,用HTTP-Tunnel Client代理软件,免费的也是经常性的掉线.正好手头上有N台服务器 ...

  9. 使用C#开发微信公众号对接ChatGPT和DALL-E

    本人是一家小公司的技术总监,工作包括写市场分析.工作汇报.产品推广文案及代码开发等.在ChatGPT推出之后本人一直在工作中使用,在头脑风暴.大纲生成.语句优化.代码生成方面很有效果.但ChatGPT ...

  10. Flutter TextField开始输入中文的时候,被打断导致错误输入字母问题

    一.Bug样例 建立一个web demo flutter run -d chrome --web-renderer html 出现问题: 输入中文的时候,比如打字 hao, 第一个字母h会先输入,变成 ...