使用NDK编译OpenSSL与curl

0. 编译环境

  • Ubuntu 20.04

  • android-ndk-r12b

  • OpenSSL-1.1.0i

  • curl-7.76.0

1. 声明编译环境

新建编译环境相关变量设置脚本,并执行该脚本:

hyj@hyj-ubuntu:~/workspace/curl_x64_r12b$ cat envsetup.sh
#!/bin/sh#adjust the following two line definition to your develop environment
NDK_ROOT=/home/hyj/workspace/android-ndk-r12b
HOST_PLATFORM=linux-x86_64
TARGET_PLATFORM=ARM_V3S#below lines always keep not changed
PROJECT_ROOT=$(pwd)
INSTALL_ROOT=${PROJECT_ROOT}/outputSYSROOT=${NDK_ROOT}/platforms/android-21/arch-arm64
CROSS_TOOLCHAIN=${NDK_ROOT}/toolchains/aarch64-linux-android-4.9/prebuilt/${HOST_PLATFORM}/bin/aarch64-linux-android-
CONFIGURE_PARAMETERS="--with-sysroot={SYSROOT} --host=arm-linux --prefix=${LIBRARY_INSTALL_PATH}"
CFLAGS="-D$TARGET_PLATFORM --sysroot=${SYSROOT} \-Wformat -Werror=format-security -fexceptions -Os -fno-omit-frame-pointer -ggdb3 \-ffunction-sections -funwind-tables -fstack-protector -no-canonical-prefixes -Os -g -DNDEBUG  \-fno-strict-aliasing -finline-limit=64 -O3 -I${SYSROOT}/usr/include \-I${NDK_ROOT}/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/lib/gcc/aarch64-linux-android/4.9.x/include -I${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.9/include \-I${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/include/"
LDFLAGS="-lgcc ${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/libgnustl_static.a \-no-canonical-prefixes -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now \-L${NDK_ROOT}/platforms/android-21/arch-arm64/usr/lib  \${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/libsupc++.a -lc -lm \--sysroot=${NDK_ROOT}/platforms/android-21/arch-arm64"mkdir -p $INSTALL_ROOT
CC=${CROSS_TOOLCHAIN}gcc
CPP="${CROSS_TOOLCHAIN}cpp --sysroot=${SYSROOT}"
CXX=${CROSS_TOOLCHAIN}g++
CXXCPP="${CROSS_TOOLCHAIN}cpp  --sysroot=${SYSROOT}"
RANLIB=${CROSS_TOOLCHAIN}ranlib
LD=${CROSS_TOOLCHAIN}ld
AR=${CROSS_TOOLCHAIN}ar
STRIP=${CROSS_TOOLCHAIN}stripPROJECT_ROOT=${PROJECT_ROOT} \
INSTALL_ROOT=${INSTALL_ROOT} \
SYSROOT=${SYSROOT} \
CFLAGS=${CFLAGS} \
LDFLAGS=${LDFLAGS} \
CONFIGURE_PARAMETERS=${CONFIGURE_PARAMETERS} \
CROSS_TOOLCHAIN=${CROSS_TOOLCHAIN} \
CC=${CC} \
CPP=${CPP} \
CXX=${CXX} \
CXXCPP=${CXXCPP} \
LD=${LD} \
RANLIB=${RANLIB} \
AR=${AR} \
STRIP=${STRIP} \bash
hyj@hyj-ubuntu:~/workspace/curl_x64_r12b$ ./envsetup.sh
hyj@hyj-ubuntu:~/workspace/curl_x64_r12b$

将编译链与相关源码下载并解压到本地之后,工程目录下的内容如下:

hyj@hyj-ubuntu:~/workspace/curl_x64_r12b$ tree -L 1
.
├── curl-7.76.0
├── curl-7.76.0.tar.bz2
├── envsetup.sh
├── openssl-1.1.0i
├── openssl-1.1.0i.tar.gz
└── output3 directories, 3 files

2. 编译OpenSSL

进入OpenSSL目录,执行工程配置命令:

cd openssl-1.1.0i
./config --prefix=${INSTALL_ROOT}/openssl no-asm no-threads -shared  --sysroot=${SYSROOT}

编辑openssl-1.1.0i/Makefile,删除该文件中所有的"-m64"选项,并进行编译与安装相关文件:

make -j8
make install
${CROSS_TOOLCHAIN}strip ${INSTALL_ROOT}/openssl/lib/*.so*

进入output目录,能够看到适用于ARM x64架构的OpenSSL的相关文件已经生成:

hyj@hyj-ubuntu:~/workspace/curl_x64_r12b/output$ tree -L 3
.
└── openssl├── bin│   ├── c_rehash│   └── openssl├── include│   └── openssl├── lib│   ├── engines-1.1│   ├── libcrypto.a│   ├── libcrypto.so -> libcrypto.so.1.1│   ├── libcrypto.so.1.1│   ├── libssl.a│   ├── libssl.so -> libssl.so.1.1│   ├── libssl.so.1.1│   └── pkgconfig├── share│   ├── doc│   └── man└── ssl├── certs├── misc├── openssl.cnf├── openssl.cnf.dist└── private14 directories, 10 files
hyj@hyj-ubuntu:~/workspace/curl_x64_r12b/output$ file openssl/lib/*
openssl/lib/engines-1.1:      directory
openssl/lib/libcrypto.a:      current ar archive
openssl/lib/libcrypto.so:     symbolic link to libcrypto.so.1.1
openssl/lib/libcrypto.so.1.1: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, stripped
openssl/lib/libssl.a:         current ar archive
openssl/lib/libssl.so:        symbolic link to libssl.so.1.1
openssl/lib/libssl.so.1.1:    ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, stripped
openssl/lib/pkgconfig:        directory

3. 编译curl

进入curl源码目录,执行工程配置命令,并进行编译与安装:

./configure --with-sysroot=${SYSROOT} --host=arm-linux --prefix=${INSTALL_ROOT}/curl --with-ssl=${INSTALL_ROOT}/openssl --disable-all  --enable-shared --enable-static --without-libidn --without-librtmp --without-gnutls --without-nss --without-libssh2 --without-zlib --without-winidn --disable-rtsp --disable-ldap --disable-ldaps --disable-ipv6
make clean
make -j8
make install
${CROSS_TOOLCHAIN}strip ${INSTALL_ROOT}/curl/lib/*.so*

进入output目录,能够看到适用于ARM x64架构的curl的相关文件已经生成:

hyj@hyj-ubuntu:~/workspace/curl_x64_r12b/output$ tree -L 3
.
├── curl
│   ├── bin
│   │   ├── curl
│   │   └── curl-config
│   ├── include
│   │   └── curl
│   ├── lib
│   │   ├── libcurl.a
│   │   ├── libcurl.la
│   │   ├── libcurl.so -> libcurl.so.4.7.0
│   │   ├── libcurl.so.4 -> libcurl.so.4.7.0
│   │   ├── libcurl.so.4.7.0
│   │   └── pkgconfig
│   └── share
│       ├── aclocal
│       └── man
└── openssl├── bin│   ├── c_rehash│   └── openssl├── include│   └── openssl├── lib│   ├── engines-1.1│   ├── libcrypto.a│   ├── libcrypto.so -> libcrypto.so.1.1│   ├── libcrypto.so.1.1│   ├── libssl.a│   ├── libssl.so -> libssl.so.1.1│   ├── libssl.so.1.1│   └── pkgconfig├── share│   ├── doc│   └── man└── ssl├── certs├── misc├── openssl.cnf├── openssl.cnf.dist└── private23 directories, 17 files
hyj@hyj-ubuntu:~/workspace/curl_x64_r12b/output$ file openssl/lib/*.so*
openssl/lib/libcrypto.so:     symbolic link to libcrypto.so.1.1
openssl/lib/libcrypto.so.1.1: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, stripped
openssl/lib/libssl.so:        symbolic link to libssl.so.1.1
openssl/lib/libssl.so.1.1:    ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, stripped
hyj@hyj-ubuntu:~/workspace/curl_x64_r12b/output$

使用NDK编译OpenSSL与curl相关推荐

  1. ActivePerl+zlib+OpenSSL+libssh2+curl编译(windows)

    WINDOWS平台上使用CURL库发送网络消息,必须支持https,那么CURL库也就必须带OPENSSL,我电脑是WIN7系统32位,故以下的各种编译均是在该环境下实测通过 如果需要支持汇编,还需要 ...

  2. android arm代码,为Android ARMV7编译OpenSSL 1.1.0

    我试图在Ubuntu机器上为Android ARMV7编译OpenSSL 1.1.0(k).但我只能为android,android armabi,android64(-aarch64)目标编译. 我 ...

  3. 安卓编译OpenSSL源码

    安卓编译OpenSSL源码. 编译OpenSSL是用ndk来编译源码的方式来生成应用程序和动态库,这种官方源码支持也比较便利. 1.下载源码解压. 注意不要下载GitHub里面的源码,最新的3.0配置 ...

  4. 智能家居(7) —— 人脸识别 翔云平台编程使用(编译openSSL支持libcurl的https访问、安装SSL依赖库openSSL)

    目录 一.祥云人工智能开放平台 二.编译openSSL支持libcurl的https访问 安装SSL依赖库openSSL(使用工具wget) curl库重新配置,编译,安装 三.编程实现人脸识别 翔云 ...

  5. android2.2编译,Android NDK编译Box2D_V2.2

    如果大家有留意的话,就知道现在很流行的 愤怒的小鸟 的物理引擎是使用了Box2D,那么如何将这好东西移植到Android上呢?在网上找了一遍,发现资料还是少得可怜,于是自己研究研究一下,遇到问题就go ...

  6. 【Android开发】:在任意目录执行NDK编译

    2019独角兽企业重金招聘Python工程师标准>>> 文以简单的例子讲述如何在任意目录把自己写的C代码使用NDK提供的交叉编译该工具来编译成Android可使用的静态库/动态库. ...

  7. Android开发实践:在任意目录执行NDK编译

    本文暂时不讲述如何用NDK编译第三方开源代码库,而是先以简单的例子讲述如何在任意目录把自己写的C代码编译成Android可使用的静态库/动态库. 1. 准备环境 首先,你得安装了Android的NDK ...

  8. win10系统 ubuntu子系统 进行ndk编译笔记

    报错1:error adding symbols: file in wrong format collect2: error: ld returned 1 exit status win10系统 ub ...

  9. NDK 编译和使用静态库、动态库

    NDK 编译和使用静态库.动态库 情况一:编译静态库 情况二:编译动态库 情况三:编译动态库+静态库 情况四:已有第三方静态库(动态库),编译静态库(动态库) 默认所有代码和文件在$project/j ...

最新文章

  1. python学习干货教程(10):列表
  2. android音视频工程师,音视频学习 (十三) Android 中通过 FFmpeg 命令对音视频编辑处理(已开源)...
  3. ScrollView 嵌套EditText 滑动冲突解决
  4. java取路径含中文_java获取项目路径中文乱码
  5. This relative module was not found ./cptable webpack
  6. Linux环境下创建运行.java文件
  7. [cerc2012][Gym100624B]20181013
  8. 志邦橱柜坑爹,志邦橱柜大忽悠,志邦橱柜欺骗
  9. Apple Watch再立功!67岁男子意外摔倒后得救
  10. Scala的初步学习(一)
  11. Linux常用命令--uname
  12. 从输入URL到页面加载的全过程
  13. 固态硬盘受损或数据删除,怎么办?详解各种恢复SSD数据方法
  14. 解决win7资源监视器不能开启
  15. abb机器人编程指令goto指令_abb机器人编程指令——轨迹偏移使用的指令以及moveL指令...
  16. 读《天才在左,疯子在右》03--灵魂深处
  17. 推送流程(极光推送)
  18. 精心分享8个让人大开眼界的软件和网站,极大提高办公效率
  19. 网络技术| 说说计算机网络及IP地址 -- 网络基础 跳线制作 IP地址配置
  20. HEVC 高级运动向量预测技术(AMVP)

热门文章

  1. QI认证的测试内容有哪些?
  2. 9.04亿网民真实数据曝光,超7成月收入竟不到这个数?
  3. MFC之滑块与旋转控件23
  4. c#,c++,qt中多线程访问UI控件线程的问题汇总
  5. 什么是随机数?什么是随机数种子?
  6. 让北大青鸟网络工程师飞得更高更快!
  7. explorer.exe 遇到问题需要关闭。我们对此引起的不便表示抱歉
  8. 我的世界java启动程下载_我的世界java启动器下载
  9. 老猿学5G扫盲贴:3GPP规范文档命名规则及同系列文档阅读指南
  10. hd disk / disk raid / disk io / iops / iostat / iowait / iotop / iometer