ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ndk-R19C 编译FFPMEG(LLVM/CLANG)

2019-06-12 20:38:09  阅读:260  来源: 互联网

标签:ndk R19C default cross CLANG cc prefix android PREFIX


  1. ffmpeg的configure脚本里里已经有了对android ndk 编译的支持了,但是有问题,不修改的话就就连编译器检查都不能通过。会报 C compile test fail
  2. 默认的configure里,有检查target-os, 如果是android cc_default 会被设置成clang,但是仅仅这样是不够的
  3. 使用llvm编译,不需要修改 .c 源码, 不会因为因为系统头文件的 #define B0 00000 这个宏需要修改源文件中的 B0 变量;不需要修改udp.c文件中的 ip_mreq_source 这个struct定义引起的不兼容

使用llvm/clang编译只需做以下几步即可:

  • 修改configure脚本,添加一个--android-cross-prefix 选项
 1 --- a/configure
 2 +++ b/configure
 3 @@ -345,6 +345,7 @@ Toolchain options:
 4 --cpu=CPU select the minimum required CPU (affects
 5 instruction selection, may crash on older CPUs)
 6 --cross-prefix=PREFIX use PREFIX for compilation tools [$cross_prefix]
 7 + --android-cross-prefix=PREFIX use PREFIX for compilation tools [$android_cross_prefix]
 8 --progs-suffix=SUFFIX program name suffix []
 9 --enable-cross-compile assume a cross-compiler is used
10 --sysroot=PATH root of cross-build tree
11 @@ -2441,6 +2442,7 @@ CMDLINE_SET="
12 objcc
13 cpu
14 cross_prefix
15 + android_cross_prefix
16 custom_allocator
17 cxx
18 dep_cc
19 @@ -4181,15 +4183,27 @@ if test -n "$cross_prefix"; then
20 enable cross_compile
21 fi
22 
23 +if test "$target_os" = android; then
24 + test -n "$android_cross_prefix" ||
25 + die "Must set android_cross_prefix for compile android"
26 + enable cross_compile
27 +fi

最后这个 if test 是检查有没有设置刚才添加的选项

除此还要设置交叉编译器的路径,涉及到四个选项

cc_default clang 的路径

cxx_default clang++ 的路径 以上两个需要用到

android_cross_prefix 选项,因为在ndk里,clang的路径里带有armv7a-linux-androideabi29- 和gcc(arm-linux-androideabi-) 的不一样

ar_default nm_default 修改代码如下:

 1 set_default target_os
 2 if test "$target_os" = android; then
 3 cc_default="clang"
 4 + cxx_default="clang++"
 5 + cc_default="${android_cross_prefix}${cc_default}"
 6 + cxx_default="${android_cross_prefix}${cxx_default}"
 7 + ar_default="${cross_prefix}${ar_default}"
 8 + nm_default="${cross_prefix}${nm_default}"
 9 +else
10 + ar_default="${cross_prefix}${ar_default}"
11 + cc_default="${cross_prefix}${cc_default}"
12 + cxx_default="${cross_prefix}${cxx_default}"
13 + nm_default="${cross_prefix}${nm_default}"
14 fi
15 
16 -ar_default="${cross_prefix}${ar_default}"
17 -cc_default="${cross_prefix}${cc_default}"
18 -cxx_default="${cross_prefix}${cxx_default}"
19 -nm_default="${cross_prefix}${nm_default}"

 

  • 增加编译脚本 build_for_android.sh
 1 #!/bin/bash
 2 #设置临时目录,不是必须的,不设置的话,会自己在系统的temp目录下生成一个, 设置的话,需要在ffmpeg的根目录下创建一个ffmpegtemp文件夹
 3 export TMPDIR=D:/FFMPEG/FFmpeg/ffmpegtemp
 4 
 5 #设置ndk目录
 6 NDK=D:/android/sdk/ndk-bundle
 7 
 8 #ar nm 的prefix
 9 PLATFORM=arm-linux-androideabi
10 
11 #llvm toolchain路径
12 TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/windows-x86_64
13 
14 #sysroot 这个一定要设置成 ndk的llvm 路径下的 sysroot 
15 SYSROOT=$TOOLCHAIN/sysroot
16 
17 #ASM 路径, 同上必须是llvm 目录下的 asm
18 ASM=$SYSROOT/usr/include/$PLATFORM
19 
20 #完整的 cross prefix
21 CROSS_PREFIX=$TOOLCHAIN/bin/$PLATFORM-
22 
23 #专门给ndk clang/clang++ 的 cross prefix
24 ANDROID_CROSS_PREFIX=$TOOLCHAIN/bin/armv7a-linux-androideabi29-
25 
26 function build_one
27 {
28   ./configure \
29     --prefix=$PREFIX \
30     --enable-shared \
31     --disable-static \
32     --disable-doc \
33     --disable-ffmpeg \
34     --disable-ffplay \
35     --disable-ffprobe \
36     --disable-avdevice \
37     --disable-doc \
38     --disable-symver \
39     --cross-prefix=$CROSS_PREFIX \
40     --android-cross-prefix=$ANDROID_CROSS_PREFIX \
41     --target-os=android \
42     --arch=arm \
43     --enable-cross-compile \
44     --sysroot=$SYSROOT \
45     --extra-cflags="-I$ASM -isysroot $SYSROOT -Os -fpic" \
46 
47   $ADDITIONAL_CONFIGURE_FLAG
48 
49   make clean
50   make -j4
51   make install
52 }
53 
54 # arm v7vfp
55 CPU=armv7-a
56 OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
57 PREFIX=./android/$CPU-vfp
58 ADDITIONAL_CONFIGURE_FLAG=
59 build_one

 

标签:ndk,R19C,default,cross,CLANG,cc,prefix,android,PREFIX
来源: https://www.cnblogs.com/tplusy/p/11012149.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有