一、編譯前環境准備
使用的內核:4.15.0-118-generic(命令:uname -r可以查看)
交叉編譯器:aarch64-linux-gnu-gcc
curl源碼:curl-7.72.0.tar.gz
openssl源碼:openssl-1.1.1g.tar.gz
本地主機:Ubuntu 18.04.5 LTS
【注:網速不好,或者始終編譯不出來的朋友可以直接加Q:3252570989獲取編譯好的庫文件。】
二、編譯openssl
因為curl依賴於openssl庫,而且兩個庫都必須用交叉編譯器編譯出庫文件。解壓源代碼tar -vxzf openssl-1.1.1g.tar.gz,進入目錄openssl-1.1.1g/,在該目錄下新建一個文件夾,我這里新建為rk3399_openssl/,(必須新建一個文件夾,不可以圖方便,將編譯好的庫放到同母錄下,否則會跟本地/usr/local里面的文件沖突,報一個名為“are the same file”的錯誤,然后make install不成功),然后首先生成Makefile,生成命令為:./config no-asm shared --prefix=/home/hesetone/Downloads/openssl-1.1.1g/rk3399_openssl,這里建議先執行export CC=/your/cross/compile/path/,比如我就是執行export CC=/usr/local/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc,,總之就是指名你用的交叉編譯器,下面是我的:
hesetone@hesetone-PU451LD:~/Downloads$ which aarch64-linux-gnu-gcc /usr/local/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc
然后開始生成openssl的Makefile,命令如下,當然,要確保用的是交叉編譯器,不確定的話,可以在執行下面的命令之前echo $CC查看一下:
./config no-asm shared --prefix=/home/hesetone/Downloads/openssl-1.1.1g/rk3399_openssl
./config執行,會生成Makefile,然后重點來了!!!需要手動打開Makefile,將里面的-m64編譯選項刪掉,一共是2處!!!再執行命令make && make install,就會在你--prefix指定的目錄下得到編譯結果,分別是bin/, include/, lib/, share/, ssl/五個文件夾,如下所示:
三、編譯curl
openssl編譯得到如上結果就表示成功,可以開始編譯libcurl庫,同樣的,我在curl-7.72.0/目錄下新建文件夾rk3399_curl/,然后執行如下命令,(為了網頁閱讀方便,為在適當地方加了換行,其實整個是一條命令):
CPPFLAGS="-I/home/hesetone/Downloads/openssl-1.1.1g/rk3399_openssl/ -I/home/hesetone/Downloads/openssl-1.1.1g/rk3399_openssl/include"
LDFLAGS="-L/home/hesetone/Downloads/openssl-1.1.1g/rk3399_openssl/lib" LIBS="-ldl" ./configure --host=aarch64
CC=/usr/local/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc
CXX=/usr/local/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++ --with-ssl --enable-shared
--enable-static --disable-dict --disable-ftp --disable-imap --disable-ldap --disable-ldaps --disable-pop3 --disable-proxy
--disable-rtsp --disable-smtp --disable-telnet --disable-tftp --disable-zlib --without-ca-bundle --without-gnutls --without-libidn
--without-librtmp --without-libssh2 --without-nss --without-zlib --prefix=/home/hesetone/Downloads/curl-7.72.0/rk3399_curl
CPPFLAGS指向openssl編譯新生成的incude/目錄,LDFLAGS指向lib/目錄,再后面就是指名CC和CXX,表示你的交叉編譯器,這里./configure執行結果為:
configure: Configured to build curl/libcurl: Host setup: aarch64-unknown-none Install prefix: /home/hesetone/Downloads/curl-7.72.0/rk3399_curl Compiler: /usr/local/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc CFLAGS: -Werror-implicit-function-declaration -O2 -Wno-system-headers -pthread CPPFLAGS: -isystem /home/hesetone/Downloads/openssl-1.1.1g/rk3399_openssl/ -isystem /home/hesetone/Downloads/openssl-1.1.1g/rk3399_openssl/include LDFLAGS: -L/home/hesetone/Downloads/openssl-1.1.1g/rk3399_openssl/lib LIBS: -lssl -lcrypto -ldl curl version: 7.72.0 SSL: enabled (OpenSSL) SSH: no (--with-{libssh,libssh2}) zlib: no (--with-zlib) brotli: no (--with-brotli) zstd: no (--with-zstd) GSS-API: no (--with-gssapi) TLS-SRP: enabled resolver: POSIX threaded IPv6: enabled Unix sockets: enabled IDN: no (--with-{libidn2,winidn}) Build libcurl: Shared=no, Static=yes Built-in manual: enabled --libcurl option: enabled (--disable-libcurl-option) Verbose errors: enabled (--disable-verbose) Code coverage: disabled SSPI: no (--enable-sspi) ca cert bundle: no ca cert path: no ca fallback: no LDAP: no (--enable-ldap / --with-ldap-lib / --with-lber-lib) LDAPS: no (--enable-ldaps) RTSP: no (--enable-rtsp) RTMP: no (--with-librtmp) Metalink: no (--with-libmetalink) PSL: no (libpsl not found) Alt-svc: no (--enable-alt-svc) HTTP2: disabled (--with-nghttp2) HTTP3: disabled (--with-ngtcp2, --with-quiche) ESNI: no (--enable-esni) Protocols: FILE GOPHER HTTP HTTPS SMB SMBS Features: AsynchDNS HTTPS-proxy IPv6 NTLM NTLM_WB SSL TLS-SRP UnixSockets
然后執行make && make install,得到如下結果,也是lib/和include/目錄,復制到你的工程即可: