一、編譯前環境准備
使用的內核: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}
)