ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

OpenSSL静态库交叉编译

2020-09-25 20:32:53  阅读:567  来源: 互联网

标签:CROSS no 静态 OpenSSL openssl COMPILE 编译 linux aarch64


一、编译前环境准备

使用的内核: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}
)

 

 

 



标签:CROSS,no,静态,OpenSSL,openssl,COMPILE,编译,linux,aarch64
来源: https://www.cnblogs.com/hesetone/p/13732385.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有