一、编译前环境准备
使用的内核: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.a和libcrypto.a必须分开指明,不然会报一个no such file or directory的错误,我也疑惑,希望看到的大佬能指明以下,其次,后面的-lssl和-lcrypto表示在-L指明的路径下寻找llibssl.a和libcrypto.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} )