OpenSSL静态库交叉编译

一、编译前环境准备

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

 

 

 



上一篇:用TensorRT针对AArch64用户的交叉编译示例


下一篇:Install Docker-compose, armbian, aarch64