FFMPEG Android集成小坑

FFMPEG Android集成小坑

  • FFMPEG Android集成小坑
    • error: conflicting types for 'av_small_strptime'
    • 汇编链接不成功

FFMPEG Android集成小坑

项目需要,集成FFMPEG。因为程序员的洁癖,只想集成一个“纯净”的代码,不可避免的踏了一些小坑。

error: conflicting types for ‘av_small_strptime’

一开始编译就出现如下错误:

ffmpeg/libavutil/parseutils.h:186:64: warning: declaration of 'struct tm' will not be visible outside of this function [-Wvisibility]
char *av_small_strptime(const char *p, const char *fmt, struct tm *dt);
                                                               ^
ffmpeg/libavutil/parseutils.h:191:25: warning: declaration of 'struct tm' will not be visible outside of this function [-Wvisibility]
time_t av_timegm(struct tm *tm);
                        ^
ffmpeg/libavutil/parseutils.c:469:64: warning: declaration of 'struct tm' will not be visible outside of this function [-Wvisibility]
char *av_small_strptime(const char *p, const char *fmt, struct tm *dt)
                                                               ^
ffmpeg/libavutil/parseutils.c:469:7: error: conflicting types for 'av_small_strptime'
char *av_small_strptime(const char *p, const char *fmt, struct tm *dt)

原因呢,非常简单:

  1. FFMPEG自带的libavutil/time.h与缺省库里面的time.h同名;
  2. 编译目录设置使得libavutil目录优先级在缺省库目录之前;

其实这个问题在FFMPEG开发中就有人发现提出过,不了了之。解决方法也随应用千奇百怪,但是基本中心思想就一条,编译时不要include libavutil目录,或把这个目录的优先级放在缺省库目录之后即可。

FFMPEG自带的configure/make流程能解决很多问题,不过也掩盖了很多问题。谁要是白手起家集成代码,就要小心这个坑了,毕竟没有谁有精力在编译一个软件的时候,还把开发中遇到的buglist都细细的看一遍。

汇编链接不成功

错误现象:所有ARM优化的汇编都编译成功了,但就是链接不成功,linker除了给一个错误代码,什么都没有。
解决更简单,其实是CONFIG_PIC没有打开, asm.S中相关的代码和链接选项冲突了。

为了适配多个平台,多个配置,FFMPEG的config.h搞了N多选项。对于任何试图自己修改的人,当然是坑你没商量。似乎这是避免不了的,想当年自己在设计asic的时候,也是版本无数,给软件人员埋了无数地雷。。。。

你可能感兴趣的:(FFMPEG Android集成小坑)