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}
)

 

 

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM