CURL NDK 交叉编译

移植curl到android,且支持https和http2.0

依赖前两篇文章

创建工作目录,并进入

 
     
1
2
 
     
mkdir android
cd android

下载源码

 
     
1
2
 
      
     
tar xfz url- 7.53. 1 .tar .gz

生成交叉编译工具链

 
     
1
 
     
$ANDROID_NDK/build/tools/make-standalone-toolchain.sh --arch=arm --install-dir=./toolchain

导出环境变量(armeabi)

 
     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
     
export ANDROID_HOME=`pwd`
export TOOLCHAIN= $ANDROID_HOME/toolchain
export PKG_CONFIG_LIBDIR= $TOOLCHAIN/lib/pkgconfig
export CROSS_SYSROOT= $TOOLCHAIN/sysroot
export PATH= $TOOLCHAIN/bin:$PATH
export TOOL=arm-linux-androideabi
export CC= $TOOLCHAIN/bin/${TOOL}-gcc
export CXX= $TOOLCHAIN/bin/${TOOL}-g++
export LINK= ${CXX}
export LD= $TOOLCHAIN/bin/${TOOL}-ld
export AR= $TOOLCHAIN/bin/${TOOL}-ar
export RANLIB= $TOOLCHAIN/bin/${TOOL}-ranlib
export STRIP= $TOOLCHAIN/bin/${TOOL}-strip
export ARCH_FLAGS= "-mthumb"
export ARCH_LINK=
export CFLAGS= "${ARCH_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64"
export CXXFLAGS= "${CFLAGS} -frtti -fexceptions"
export LDFLAGS= "${ARCH_LINK}"

编译并安装

 
     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
     
cd curl-7.53.1
autoreconf -i
./configure --prefix=$TOOLCHAIN/sysroot/usr/local \
- -with-sysroot=$TOOLCHAIN/sysroot \
--host=arm-linux-androideabi \
--with-ssl=$TOOLCHAIN/sysroot/usr/local \
--with-nghttp2=$TOOLCHAIN/sysroot/usr/local \
--enable-ipv6 \
--enable-static \
--enable-threaded-resolver \
--disable-dict \
--disable-gopher \
--disable-ldap --disable-ldaps \
--disable-manual \
--disable-pop3 --disable-smtp --disable-imap \
--disable-rtsp \
--disable-shared \
--disable-smb \
--disable-telnet \
--disable-verbose
make -j4
make install

卸载

 
     
1
 
     
make uninstall

configure完成后检查输出结果是否enable ssl, enable https, enable http2.0

 
     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 
     
Configured to build curl/libcurl:
curl version: 7.53 .1
Host setup: arm-unknown-linux-androideabi
Install prefix: /Users/lizhangqu/Desktop/android/toolchain/sysroot/usr/local
Compiler: /Users/lizhangqu/Desktop/android/toolchain/bin/arm-linux-androideabi-gcc
SSL support: enabled (OpenSSL)
SSH support: no (--with-libssh2)
zlib support: enabled
GSS-API support: no (--with-gssapi)
TLS-SRP support: enabled
resolver: POSIX threaded
IPv6 support: enabled
Unix sockets support: enabled
IDN support: no (--with-{libidn2,winidn})
Build libcurl: Shared=no, Static=yes
Built-in manual: no (--enable-manual)
- -libcurl option: enabled (--disable-libcurl-option)
Verbose errors: no
SSPI support: no (--enable-sspi)
ca cert bundle: no
ca cert path: no
ca fallback: no
LDAP support: no (--enable-ldap / --with-ldap-lib / --with-lber-lib)
LDAPS support: no (--enable-ldaps)
RTSP support: no (--enable-rtsp)
RTMP support: no (--with-librtmp)
metalink support: no (--with-libmetalink)
PSL support: no (libpsl not found)
HTTP2 support: enabled (nghttp2)
Protocols: FILE FTP FTPS HTTP HTTPS TFTP
SONAME bump: yes - WARNING: this library will be built with the SONAME
number bumped due to (a detected) ABI breakage.
See lib/README.curl_off_t for details on this.

armeabi-v7a

 
     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
     
$ANDROID_NDK/build/tools/make-standalone-toolchain.sh --arch=arm --install-dir=./toolchain
export TOOL=arm-linux-androideabi
export ARCH_FLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16"
export ARCH_LINK="-march=armv7-a -Wl,--fix-cortex-a8"
./configure --prefix=$TOOLCHAIN/sysroot/usr/local \
- -with-sysroot=$TOOLCHAIN/sysroot \
--host=arm-linux-androideabi \
--with-ssl=$TOOLCHAIN/sysroot/usr/local \
--with-nghttp2=$TOOLCHAIN/sysroot/usr/local \
--enable-ipv6 \
--enable-static \
--enable-threaded-resolver \
--disable-dict \
--disable-gopher \
--disable-ldap --disable-ldaps \
--disable-manual \
--disable-pop3 --disable-smtp --disable-imap \
--disable-rtsp \
--disable-shared \
--disable-smb \
--disable-telnet \
--disable-verbose

x86

 
     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
     
$ANDROID_NDK/build/tools/make-standalone-toolchain.sh --arch=x86 --install-dir=./toolchain
export TOOL=i686-linux-android
export ARCH_FLAGS="-march=i686 -msse3 -mstackrealign -mfpmath=sse"
export ARCH_LINK=""
./configure --prefix=$TOOLCHAIN/sysroot/usr/local \
- -with-sysroot=$TOOLCHAIN/sysroot \
--host=i686-linux-android \
--with-ssl=$TOOLCHAIN/sysroot/usr/local \
--with-nghttp2=$TOOLCHAIN/sysroot/usr/local \
--enable-ipv6 \
--enable-static \
--enable-threaded-resolver \
--disable-dict \
--disable-gopher \
--disable-ldap --disable-ldaps \
--disable-manual \
--disable-pop3 --disable-smtp --disable-imap \
--disable-rtsp \
--disable-shared \
--disable-smb \
--disable-telnet \
--disable-verbose

何大仙提供的shell脚本

 
     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
 
     
#!/bin/sh
if [! -f "curl-7.53.1.tar.gz" ]; then
fi
if [! -d "curl-7.53.1" ]; then
tar zxf curl-7.53.1.tar.gz
fi
# env
if [-d "out/curl" ]; then
rm -fr "out/curl"
fi
mkdir "out"
mkdir "out/curl"
_compile() {
SURFIX= $1
TOOL= $2
ARCH_FLAGS= $3
ARCH_LINK= $4
ARCH= $5
if [! -d "out/curl/${SURFIX}" ]; then
mkdir "out/curl/${SURFIX}"
fi
if [! -d "toolchain_${SURFIX}" ]; then
$ANDROID_NDK/build/tools/make-standalone-toolchain.sh --arch= ${ARCH} --install-dir=./toolchain_ ${SURFIX}
fi
export ANDROID_HOME=` pwd`
export TOOLCHAIN= $ANDROID_HOME/toolchain_ ${SURFIX}
export PKG_CONFIG_LIBDIR= $TOOLCHAIN/lib/pkgconfig
export CROSS_SYSROOT= $TOOLCHAIN/sysroot
export PATH= $TOOLCHAIN/bin: $PATH
export CC= $TOOLCHAIN/bin/ ${TOOL}-gcc
export CXX= $TOOLCHAIN/bin/ ${TOOL}-g++
export LINK= ${CXX}
export LD= $TOOLCHAIN/bin/ ${TOOL}-ld
export AR= $TOOLCHAIN/bin/ ${TOOL}-ar
export RANLIB= $TOOLCHAIN/bin/ ${TOOL}-ranlib
export STRIP= $TOOLCHAIN/bin/ ${TOOL}-strip
export ARCH_FLAGS= $ARCH_FLAGS
export ARCH_LINK= $ARCH_LINK
export CFLAGS= "${ARCH_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64"
export CXXFLAGS= "${CFLAGS} -frtti -fexceptions"
export LDFLAGS= "${ARCH_LINK}"
cd curl-7.53.1/
autoreconf -i
./configure --prefix= $TOOLCHAIN/sysroot/usr/ local \
--with-sysroot= $TOOLCHAIN/sysroot \
--host= ${TOOL} \
--with-ssl= $TOOLCHAIN/sysroot/usr/ local \
--with-nghttp2= $TOOLCHAIN/sysroot/usr/ local \
-- enable-ipv6 \
-- enable-static \
-- enable-threaded-resolver \
-- disable-dict \
-- disable-gopher \
-- disable-ldap -- disable-ldaps \
-- disable-manual \
-- disable-pop3 -- disable-smtp -- disable-imap \
-- disable-rtsp \
-- disable-shared \
-- disable-smb \
-- disable-telnet \
-- disable-verbose
make clean
make -j4
make install
cd ..
mv curl-7.53.1/lib/.libs/libcurl.a out/curl/ ${SURFIX}/
}
# arm
_compile "armeabi" "arm-linux-androideabi" "-mthumb" "" "arm"
# armv7
_compile "armeabi-v7a" "arm-linux-androideabi" "-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16" "-march=armv7-a -Wl,--fix-cortex-a8" "arm"
# arm64v8
_compile "arm64-v8a" "aarch64-linux-android" "" "" "arm64"
# x86
_compile "x86" "i686-linux-android" "-march=i686 -m32 -msse3 -mstackrealign -mfpmath=sse -mtune=intel" "" "x86"
# x86_64
_compile "x86_64" "x86_64-linux-android" "-march=x86-64 -m64 -msse4.2 -mpopcnt -mtune=intel" "" "x86_64"
# mips
_compile "mips" "mipsel-linux-android" "" "" "mips"
# mips64
_compile "mips64" "mips64el-linux-android" "" "" "mips64"
echo "done"

http://fucknmb.com/2017/05/24/CURL-NDK%E4%BA%A4%E5%8F%89%E7%BC%96%E8%AF%91/
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Linux下使用curl进行交叉编译,首先需要安装相关的交叉编译工具链。根据目标平台选择适当的工具链,如ARM、MIPS等。然后,下载curl的源代码包并解压。 进入curl源码目录后,可以配置编译参数。使用./configure命令,通过指定交叉编译工具链的位置和参数,来进行交叉编译的配置。例如: ``` ./configure --host=交叉编译工具链的前缀 ``` 其中,"--host"参数后面跟的是经过交叉编译工具链前缀,如arm-linux-gnueabi、mips-linux-gnu等。这样配置之后,就可以使用交叉编译器来编译curl了。 配置完成后,运行make命令进行编译。编译完成后,即生成了交叉编译后的curl可执行文件。 最后,将生成的可执行文件拷贝到目标平台上进行运行测试即可。 总结起来,通过安装交叉编译工具链、配置编译参数,以及使用make命令进行编译,就可以在Linux下完成curl交叉编译。 ### 回答2: 在Linux系统下,交叉编译是指在一台主机上用特定工具链编译生成适用于另一种主机架构的可执行程序。对于curl在Linux下的交叉编译,以下是一些步骤: 首先,我们需要设置交叉编译环境。这包括安装交叉编译工具链和交叉编译的目标架构的头文件与库。 然后,我们需要下载curl的源代码。可以从curl的官方网站下载最新版本的源代码。 接下来,我们需要根据交叉编译工具链的要求配置curl的编译选项。这可能涉及到指定目标架构、链接选项、头文件和库的路径等。 然后,我们可以运行configure命令来生成适用于交叉编译环境的Makefile。configure命令会根据主机架构、编译选项等自动配置Makefile。 接着,我们可以运行make命令进行编译。make命令会根据Makefile中的指令来编译生成可执行程序。在编译过程中,可能会出现一些依赖问题需要解决,比如缺少某些库文件。 最后,我们可以运行make install命令将编译生成的可执行程序安装到目标机器中。 需要注意的是,根据交叉编译工具链和目标架构的不同,具体的交叉编译过程可能会有所差异。因此,在进行交叉编译前,建议阅读相关文档或参考其他资源,以便更好地理解和掌握交叉编译的步骤和注意事项。 ### 回答3: 在Linux下进行curl交叉编译,需要以下几个步骤: 1. 安装交叉编译工具链:首先需要在Linux系统中安装适合目标平台的交叉编译工具链。根据目标平台的不同,可以选择不同的工具链,例如gcc、g++等。 2. 下载curl源代码:从curl的官方网站上下载最新的curl源代码包,并解压到本地。 3. 配置交叉编译环境:打开终端,进入解压后的curl源代码目录下,执行以下命令: ``` export CC=交叉编译器路径 export CXX=交叉编译器路径 export AR=交叉编译器路径-ar export RANLIB=交叉编译器路径-ranlib export LD=交叉编译器路径-ld export STRIP=交叉编译器路径-strip export CPPFLAGS="-I交叉编译器路径/include" export LDFLAGS="-L交叉编译器路径/lib" ``` 替换上述命令中的“交叉编译器路径”为实际的交叉编译工具链路径。 4. 配置编译选项:执行以下命令配置编译选项: ``` ./configure --host=目标平台 --prefix=安装路径 ``` 其中,目标平台是指要将curl交叉编译到的目标硬件平台,安装路径是指将编译后的curl安装到的目录。根据实际的需求进行配置。 5. 编译和安装:执行以下命令开始编译和安装: ``` make make install ``` 编译过程可能需要一些时间,等待编译完成后,curl将被安装到指定的安装路径下。 通过以上步骤,我们可以在Linux下成功进行curl交叉编译。在配置交叉编译环境时,需要注意交叉编译器的选择和路径的配置,确保编译工具链已正确安装,并设置正确的编译选项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值